...
<element>
<e:Element1 xmlns:e="mynamespace" > ... </.. >
<e:Element1 xmlns:e="mynamespace" > ... </.. >
<e:Element1 xmlns:e="mynamespace" > ... </.. >
<a/>
</element>
...
和这个XPath:
//*[local-name()='element']/count(*)
返回4即可。
但现在我想知道element1的数量是什么。我尝试了很多可能性,但没有成功。我必须使用local-name和namespace-uri()
答案 0 :(得分:43)
您可以尝试以下操作:
count(//element/Element1[namespace-uri()='mynamespace'])
答案 1 :(得分:2)
如果您在Java或C#等环境中使用XPath,则应首先将前缀绑定到命名空间,这取决于您使用的API,但类似于
xpath.declareNamespace("f", "mynamespace")
然后评估XPath表达式
count(element/f:Element1)
我故意从源文档中选择一个不同的前缀,只是为了表明你可以使用你喜欢的任何前缀,但是如果你选择的前缀是一致的话,你的代码当然更具可读性。
答案 2 :(得分:0)
对于以下有效的XML
<element>
<e:Element1 xmlns:e="mynamespace"></e:Element1>
<e:Element1 xmlns:e="mynamespace"></e:Element1>
<e:Element1 xmlns:e="mynamespace"></e:Element1>
<a/>
</element>
这个XSL
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:e="mynamespace">
<xsl:template match="/">
<xsl:value-of select="count(element/e:Element1)"/>
</xsl:template>
</xsl:stylesheet>
提供 3 的所需输出。
使用正确的命名空间限定选择器。
您的问题很接近,您可以删除命名空间并使用以下XSL:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:value-of select="count(element/*[local-name()='Element1'])"/>
</xsl:template>
</xsl:stylesheet>