2017-11-05 12 views
0

제목, 가격, 저자, 추가 가격, 아티스트, 국가 등의 속성을 가진 책 목록이있는 XML이 있습니다. XML은 아래와 같습니다. <?xml version="1.0" encoding="UTF-8"?> <catalog> <cd> <title>Empire Burlesque</title> <artist>Bob Dylan</artist> <country>USA</country> <company>Columbia</company> <price>10.90</price> <additionalprice>12.90</additionalprice> <year>1985</year> </cd> <cd> <title>Hide your heart</title> <artist>Bonnie Tyler</artist> <country>UK</country> <company>CBS Records</company> <price>9.90</price> <additionalprice>10.90</additionalprice> <year>1988</year> </cd>xslt 3.0에서 accumulator를 사용하면 필요하지 않습니다.

그래서 내가 HTML를 얻기 위해 XML에 적용되는 XSLT 3.0을 기록 할

에 . 누적기를 사용하여 카탈로그의 총 도서 수를 얻고 싶습니다. 더 나은 방법이 있긴하지만, 저는 연습용으로 축약기를 사용하고 열이 제목, 저자 및 총 가격 인 책이 들어있는 테이블 끝에 총계를 인쇄하려고했습니다. 제목과 저자를 채우기 위해, 나는 for-each를 사용했다. 총 가격 = price + additionalPrice. 총 가격을 제출할 때 반복을 사용하고 싶습니다. 아무도 이걸로 나를 도울 수 있을까. 내 불완전 스타일 시트는 다음과 같습니다

`<?xml version="3.0" encoding="UTF-8"?> 
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<html> 
<body> 
    <h2>My CD Collection</h2> 
    <table border="2"> 
    <tr bgcolor="#9acd32"> 
     <th style="text-align:left">Title</th> 
     <th style="text-align:left">Artist</th> 
     <th style="text-align:left">Total Price</th> 
    </tr> 
<xsl:accumulator name="total" as="xs:integer" initial-value="0" streamable="no"> 
    <xsl:accumulator-rule match="title" select="$value+1"/> 
</xsl:accumulator> 
    <xsl:for-each select="catalog/cd"> 
    <tr> 
     <td><xsl:value-of select="title"/></td> 
     <td><xsl:value-of select="artist"/></td> 
    </tr> 
    </xsl:for-each> 
     <tr bgcolor="#FFA500"> 
      <td> Total number of Books </td> 
      <td> <xsl:value-of select="accumulator-before('total')"/</td> 
     </tr> 
    </table> 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet>` 

난 당신이 당신이로 사용이 의미 xsl:accumulator이 선언이라고 볼 다음 사양 https://www.w3.org/TR/xslt-30/#accumulator-declaration 보면

답변

3

스트리밍을 사용하지 않으 템플릿의 내부가 아닌 xsl:stylesheet의 최상위 요소/하위 요소입니다.

accumulator 값은 노드와 연관되며 https://www.w3.org/TR/xslt-30/#func-accumulator-before과 같은 함수는 "컨텍스트 노드에서 선택한 누적 기의 사전 강하 값을 반환합니다."따라서 컨텍스트 노드가있는 단일 템플릿이있는 / 값보다 먼저 누적기에 액세스하는 것이 의미가 없으면 오히려 accumulator-after 값이 필요합니다.

마지막으로 당신은 누적는 위의 하나가 나를 위해 @Martin 작동하지 않는 기본 모드

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" exclude-result-prefixes="xs math" 
    version="3.0"> 

    <xsl:mode use-accumulators="#all"/> 

    <xsl:accumulator name="total" as="xs:integer" initial-value="0" streamable="no"> 
     <xsl:accumulator-rule match="title" select="$value + 1"/> 
    </xsl:accumulator> 

    <xsl:template match="/"> 
     <html> 
      <body> 
       <h2>My CD Collection</h2> 
       <table border="2"> 
        <tr bgcolor="#9acd32"> 
         <th style="text-align:left">Title</th> 
         <th style="text-align:left">Artist</th> 
         <th style="text-align:left">Total Price</th> 
        </tr> 

        <xsl:for-each select="catalog/cd"> 
         <tr> 
          <td> 
           <xsl:value-of select="title"/> 
          </td> 
          <td> 
           <xsl:value-of select="artist"/> 
          </td> 
         </tr> 
        </xsl:for-each> 
        <tr bgcolor="#FFA500"> 
         <td> Total number of Books </td> 
         <td> 
          <xsl:value-of select="accumulator-after('total')"/> 
         </td> 
        </tr> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 
+0

에 적용 할 것을 선언합니다. 이유를 모르겠다. 줄을 제거 할 때 누산기로 채워야하는 값이 비어있는 출력을 얻습니다. 나는 https://www.w3schools.com/xml/tryxslt.asp를 사용하므로 컴파일 오류가 발생하지 않습니다. – swifty

+2

XSLT 3을 사용하려면 XSLT 3 프로세서를 사용해야합니다. 연결된 도구는 하나가 아닙니다. 올해의 최종 XSLT 3 사양과 일치하는 것으로 알려진 XSLT 3 구현은 Saxon 9.8 및 Altova 2017 R3 또는 2018이므로 XSLT 3을 사용하려면이 중 하나를 시도해 보시기 바랍니다. Saxon 9.8 HE with 당신의 입력이 잘 형성되고 완성되도록 수정되었고, 완전한'xsl : stylesheet' 내의 나의 발췌 문장은 'accumulator-after ('total ')'에 대해'2'를 출력합니다. Altova XMLSpy 2018처럼. –

+0

나는 코드를 편집했습니다. 스 니펫을 사용하여 스타일 시트의 본문에 대한 관련 코드 만 갖는 이전 스 니펫으로 인해 문제가 발생한 경우를 대비하여 전체 스타일 시트로 변환했습니다. –