...
<element>
<e:Element1 xmlns:e="mynamespace" > ... </.. >
<e:Element1 xmlns:e="mynamespace" > ... </.. >
<e:Element1 xmlns:e="mynamespace" > ... </.. >
<a/>
</element>
...
et ce XPath:
//*[local-name()='element']/count(*)
retourne 4 ce qui est OK. mais maintenant je veux savoir le nombre d'éléments1 ce qui est 3. J'essaie beaucoup de possibilités mais sans succès. Je dois utiliser local-name et namespace-uri()
Vous pouvez essayer ce qui suit:
count(//element/Element1[namespace-uri()='mynamespace'])
Si vous utilisez XPath à partir d'un environnement tel que Java ou C #, vous devez d'abord lier un préfixe à l'espace de noms, qui dépend de l'API que vous utilisez, mais sera quelque chose comme
xpath.declareNamespace("f", "mynamespace")
puis évaluer l'expression XPath
count(element/f:Element1)
J'ai délibérément choisi un préfixe différent de celui de votre document source juste pour montrer que vous pouvez utiliser n'importe quel préfixe que vous aimez, mais bien sûr votre code est plus lisible si vous êtes cohérent dans votre choix de préfixes.
Pour le XML valide suivant
<element>
<e:Element1 xmlns:e="mynamespace"></e:Element1>
<e:Element1 xmlns:e="mynamespace"></e:Element1>
<e:Element1 xmlns:e="mynamespace"></e:Element1>
<a/>
</element>
ce 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>
donne la sortie souhaitée de .
Le sélecteur est qualifié avec l'espace de noms correct.
Vous étiez proche de votre question et vous pouviez supprimer l'espace de noms et utiliser le XSL suivant à la place:
<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>