2012-10-26 3 views
1

다음 xml 샘플이 있는데 n = 1 ~ 5 인 각 책에 대해 "book #n name is xxx"를 출력하려고합니다. position()은 1,2,1,2로 평가됩니다. 3 그래서 나는 그 기능을 사용할 수 없다. 감사합니다. .전체 문서의 요소 위치

<books> 
    <cat> 
    <book>a</book> 
    <book>b</book> 
    </cat> 
    <cat> 
    <book>c</book> 
    <book>d</book> 
    <book>e</book> 
    </cat> 
</books> 
... 
... 
<xsl:template match="book"> 
<!-- I need expression to evaluate as: 
book a = 1 
book b = 2 
book c = 3 
book d = 4 
book e = 5 
--> 
    <xls:variable name="idx" select="postition()"/> 
    name of book #<xsl:value-of select="$idx"/> is <xsl:value-of select"."/> 
</xsl:template> 

답변

2

사용 :

count(ancestor::book | preceding::book) +1 

:

count(preceding::book) +1 

하는 것이 가능한 경우 book 요소, 다음 사용할 올바른 표현되고 중첩 된 것으로, 그러나, 메모를 수행 또는을 사용할 수 있습니다. <xsl:number>

전체 코드 : 원하는 정확한 결과를 제작

<books> 
    <cat> 
    <book>a</book> 
    <book>b</book> 
    </cat> 
    <cat> 
    <book>c</book> 
    <book>d</book> 
    <book>e</book> 
    </cat> 
</books> 

:

이 변환이 제공된 XML 문서에인가

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="book"> 
    <xsl:value-of select= 
    "concat('book ', ., ' = ', count(preceding::book) +1, '&#xA;')"/> 
</xsl:template> 
</xsl:stylesheet> 

book a = 1 book b = 2 book c = 3 book d = 4 book e = 5 

II. <xsl:number> 사용 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="book"> 
    <xsl:value-of select="concat('&#xA;book ', ., ' = ')"/> 
    <xsl:number level="any" count="book"/> 
</xsl:template> 
</xsl:stylesheet> 

III. 적절한 <xsl:apply-templates>으로 position() 사용 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="/*/*/book"/> 
</xsl:template> 

<xsl:template match="book"> 
    <xsl:value-of select="concat('&#xA;book ', ., ' = ', position())"/> 
</xsl:template> 
</xsl:stylesheet> 

설명 :

position() 값이 템플릿의 선택을 야기 <xsl:apply-templates>의 제조 노드리스트에서 현재 노드의 위치는 실행을 위해. 올바른 <xsl:apply-templates>을 사용하는 경우 position() 일 수 있습니다.

+0

감사합니다. Dimitre. 정확히 내가 무엇을 찾고 있었는지. 이제 어떻게 작동하는지보기 위해 선행을 찾아야합니다;) – bretter

+0

@bretter, 여러분 환영합니다. 이 답변을 여러 번 편집 했으므로 세 가지 해결책을 모두 보지 못했을 수도 있습니다. 예, '선행'과 '조상'축,''명령,''명령과'position()'함수에 대해서 읽는 것이 흥미로울 것입니다 . –

+0

@DimitreNovatchev - 흥미롭게도 당신이 제공 한 첫 번째 XSLT는 ( ABach