XPath中的元素数

时间:2011-09-12 20:24:00

标签: xml xpath

...
<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()

3 个答案:

答案 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>