Ответ 1
Вы можете попробовать следующее:
count(//element/Element1[namespace-uri()='mynamespace'])
...
<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()
Вы можете попробовать следующее:
count(//element/Element1[namespace-uri()='mynamespace'])
Если вы используете XPath из среды, такой как Java или С#, вы должны сначала привязать префикс к пространству имен, который зависит от API, который вы используете, но будет что-то вроде
xpath.declareNamespace("f", "mynamespace")
а затем оцените выражение XPath
count(element/f:Element1)
Я намеренно выбрал другой префикс из того, который был в вашем исходном документе, чтобы показать, что вы можете использовать любой префикс, который вам нравится, но, конечно, ваш код более читабельен, если вы согласны в выборе префиксов.
Для следующего допустимого 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>