Количество элементов в 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, что в порядке. но теперь я хочу узнать количество элементов1, что есть 3. Я стараюсь много возможностей, но не преуспел. Мне нужно использовать local-name и namespace-uri()

Ответы

Ответ 1

Вы можете попробовать следующее:

count(//element/Element1[namespace-uri()='mynamespace'])

Ответ 2

Если вы используете XPath из среды, такой как Java или С#, вы должны сначала привязать префикс к пространству имен, который зависит от API, который вы используете, но будет что-то вроде

xpath.declareNamespace("f", "mynamespace")

а затем оцените выражение XPath

count(element/f:Element1)

Я намеренно выбрал другой префикс из того, который был в вашем исходном документе, чтобы показать, что вы можете использовать любой префикс, который вам нравится, но, конечно, ваш код более читабельен, если вы согласны в выборе префиксов.

Ответ 3

Для следующего допустимого 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>