2014-10-30 77 views
0

XML:如何獲得節點的索引節點的數量有特殊屬性值

<fields> 
    <field name="name1" /> 
    <field name="special" /> 
    <field name="name1" /> 
    <field name="special" /> 
    <field name="name1" /> 
</fields> 

XSLT:

<xsl:apply-temlates select="//field" /> 

...

<xsl:template match="field[@name='special']"> 
    <xsl:value-of select="_what_here?_" /> 
</xsl:template> 

我的模板必須返回1和2而不是2和4像位置()那樣。 我怎樣才能得到它?

回答

2

使用preceding-sibling::軸來代替所有相關的field元素。

樣式

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="text" encoding="UTF-8"/> 

    <xsl:strip-space elements="*"/> 

    <xsl:template match="/fields"> 
     <xsl:apply-templates select="field"/> 
    </xsl:template> 

    <xsl:template match="field[@name='special']"> 
     <xsl:value-of select="count(preceding-sibling::field[@name='special']) + 1" /> 
    </xsl:template> 

</xsl:transform> 

文本輸出

12 

另一種解決方案是完全不使用單獨的模板,但for-each。在for-each內部,position()函數的行爲與您所希望的完全相同 - 它將檢索for-each中元素序列中的位置。

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="text" encoding="UTF-8"/> 

    <xsl:strip-space elements="*"/> 

    <xsl:template match="/fields"> 
     <xsl:for-each select="field[@name='special']"> 
      <xsl:value-of select="position()"/> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:transform> 
+0

對於兩個XSLT代碼+1。 – 2014-10-30 11:21:16

相關問題