2012-11-27 2 views
1

있는 테이블은 아래의 XML 내가 행 당이 책 XHTML이 XML 파일을 표시 XSL 스타일 시트를 작성해야- 사전 정의 된 폭

<?xml version="1.0" encoding="ISO-8859-1"?> 

<bookstore> 

<book> 
    <title lang="eng">Harry Potter</title> 
    <price>29.99</price> 
</book> 
<book> 
    <title lang="eng">Learning XML</title> 
    <price>39.95</price> 
</book> 
<book> 
    <title lang="eng">A book</title> 
    <price>39.95</price> 
</book> 
<book> 
    <title lang="eng">Another Book</title> 
    <price>39.95</price> 
</book> 

</bookstore> 

을 상상해보십시오. XML 파일의 책 수는 언제든지 변경 될 수 있으므로 XSL이 이것을 고려해야합니다. 나는 이것의 한 가지 해결책이 데이터를 테이블에 넣는 것이라고 생각했지만, 이것을 만들 수있는 올바른 방법을 생각할만큼 두뇌를 감쌀 수는 없다. 가능한 아이디어는 모듈 2 검사를 수행하거나 전체 책을 2로 나누지 만 올바른 코드를 작성하기 위해 이것이 어떻게 작성 될지 결론 지을 수는 없습니다. 다음은 하나의 긴 열에 하나씩 모든 책을 차례로 표시하는 방법입니다.

<xsl:template match="/"> 
    <html> 
     <head> 
     <link rel="stylesheet" type="text/css" href="css/theStyle.css" /> 
     </head> 
     <body onload="parent.alertsize(document.body.scrollHeight);"> 

      <div> 

       <!-- <p><xsl:value-of select="count(//book)"/></p>--> 
       <xsl:for-each select="/bookstore/book"> 


         <h4><xsl:value-of select='title' /></h4> 
         <p><xsl:value-of select='price' /></p> 


        <!--<xsl:if test="postion() mod 2 = 0"> 
         <p>a mod 0</p> 
        </xsl:if>--> 
       </xsl:for-each> 

      </div> 

     </body> 
    </html> 
</xsl:template> 

<?xml version="1.0" encoding="ISO-8859-1"?> 
모든 팁/포인터/용액

크게 감사.

답변

0

솔루션

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <html> 
     <head> 
     <link rel="stylesheet" type="text/css" href="css/theStyle.css" /> 
     </head> 
     <body onload="parent.alertsize(document.body.scrollHeight);"> 
     <div> 
      <xsl:apply-templates select="bookstore/book"/> 
     </div> 
     </body> 
    </html> 
    </xsl:template> 
    <xsl:template match="book[position() mod 2 = 1]"> 
    <h4> 
     <xsl:value-of select='title' /> 
    </h4> 
    <p> 
     <p>a mod 1</p> 
     <xsl:value-of select='price' /> 
    </p> 
    </xsl:template> 
    <xsl:template match="book[position() mod 2 = 0]"> 
    <h4> 
     <xsl:value-of select='title' /> 
    </h4> 
    <p> 
     <p>a mod 0</p> 
     <xsl:value-of select='price' /> 
    </p> 
    </xsl:template> 

</xsl:stylesheet> 

결과 (반드시 솔루션으로 테이블이 필요하지 않습니다, 난 그냥이 하나의 옵션이 될 줄 알았는데)

<html> 
    <head> 
    <META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <link rel="stylesheet" type="text/css" href="css/theStyle.css"> 
    </head> 
    <body onload="parent.alertsize(document.body.scrollHeight);"> 
    <div> 
     <h4>Harry Potter</h4> 
     <p> 
     <p>a mod 1</p>29.99</p> 
     <h4>Learning XML</h4> 
     <p> 
     <p>a mod 0</p>39.95</p> 
     <h4>A book</h4> 
     <p> 
     <p>a mod 1</p>39.95</p> 
     <h4>Another Book</h4> 
     <p> 
     <p>a mod 0</p>39.95</p> 
    </div> 
    </body> 
</html> 

설명

루프와을 사용할 수 있습니다.을 사용하면 동일한 결과를 얻을 수 있지만 템플릿이 훨씬 강력합니다. 일치 된 인수에만 적용되는 함수로 생각할 수 있습니다. 이것은 코드의 들여 쓰기를 줄이고 홀수와 짝수 도서의 템플릿을 서로 분리하는 데 확실히 도움이됩니다.

+0

이 도움을 주셔서 감사합니다. 템플릿이 조금 더 나아 졌음을 이해하는 것처럼 느껴졌습니다. 이제 이것이 해결책이기도합니다. 그러나 결과 코드는 iframe에 배치 될 예정이며 XSL을 사용하여 요소를 각 행에 2 개만 표시 할 수 있어야합니다. iframe의 너비를 알고 있으므로 주위를 어둡게 놓으면 간격을 추가 할 수 있습니까? 아니면 다른 사람이 다른 솔루션을 생각할 수 있습니까 ?? 결과 코드로 계속해서 표시 될 것입니다. – neilfoxholes

+0

@neilfoxholes 글쎄, 나는 당신의 질문에 대한 XSL 변환, 타겟 HTML을 꽤 다른 문제라고 생각. 두 개의 열 레이아웃 (http://mirificampress.com/show.php?id=106은 나쁜 것이 아닙니다)에 대한 자습서 중 하나를 살펴보고 이것이 효과가 있는지 확인하십시오. –

+0

도움 주셔서 감사합니다. 나는 이제 내 문제를 해결했다. – neilfoxholes

관련 문제