web-dev-qa-db-fra.com

nombre d'éléments dans XPath

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

27
hudi

Vous pouvez essayer ce qui suit:

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

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.

2
Michael Kay

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>
0
andyb