一XSLT 1.0/XPath 1.0中
我不相信有一種方法用純XPath 1.0中做到這一點(因爲你正在尋找是不同的元素名稱,我認爲,在不任何特定的順序[無論如何,我不喜歡依賴於某種秩序])。
也就是說,您可以使用基於密鑰的XSLT 1.0解決方案來解決問題。
當該XSLT 1.0文檔:
<films>
<film>
<title/>
<year/>
<actor/>
</film>
<film>
<title/>
<year/>
<actor/>
</film>
</films>
...的:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="no" indent="yes" method="text"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kFilmChildren" match="film/*" use="name()"/>
<xsl:template match="/">
<xsl:value-of
select="count(//film/*[
generate-id() =
generate-id(key('kFilmChildren', name())[1])
])"/>
</xsl:template>
</xsl:stylesheet>
...抵靠示例XML(包裝在一個根元素)施加想要的結果是:
3
如果我們將同樣的樣式表對一個稍微修改XML:
<films>
<film>
<title/>
<year/>
<actor/>
<test/>
</film>
<film>
<title/>
<year/>
<actor/>
<test/>
<test2/>
</film>
</films>
......再次,正確的答案是生產:
5
注:鑑於你沒有顯示完整的文檔,我通過使用//
表達式彌補了這些缺乏知識。然而,這可能是一個非常大的樹木附近昂貴的操作;你會做得更好,讓你更具體。
二, XSLT 2.0/XPath 2.0
Pure XPath 2。
count(distinct-values(//film/*/name()))
XSLT驗證::
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output omit-xml-declaration="no" indent="yes" method="text" />
<xsl:strip-space elements="*" />
<xsl:template match="/">
<xsl:value-of select="count(distinct-values(//film/*/name()))" />
</xsl:template>
</xsl:stylesheet>
結果:
3
如何使用'follow ::'軸?雖然我不太明白你在這裏想要什麼,所以我可能完全錯誤。 – biziclop