J'ai un problème vraiment confus sur mes mains ..résultats XPath de XSLT sont incorrects - ne passe pas par XML entier
Il semble cependant que toute la hiérarchie des données XML ne sont pas recherchée par lors de l'utilisation d'un XPath expression dans XSL.
Certaines données XML mannequin:
<pets name="myPets" NUM="2">
<dog name="allMyDogs" NUM="5">
<dog name="Frank" NUM="3"/>
<dog name="Spot" NUM="4"/>
<dog name="Rover" NUM="1"/>
<dog name="Rupert" NUM="6"/>
<cat name="Lucy" NUM="4"/>
</dog>
<cat name="allMyCats" NUM="4">
<cat name="Simba" NUM="4"/>
<cat name="Princess" NUM="5"/>
<cat name="Fluffy" NUM="1"/>
<cat name="Lucy" NUM="3"/>
<cat name="Lucy" NUM="35"/>
<cat name="Lucy" NUM="6"/>
<cat name="Lucy" NUM="1"/>
</cat>
<cat name="Lucy" NUM="9"/>
</pets>
Ce qui suit est la partie du code XSLT je crois est l'origine du problème:
<xsl:key name="elem_key" match="elem" use="concat(@key, .)" />
<xsl:variable name="all_data">
<xsl:apply-templates select="*">
<xsl:sort select="name()" />
</xsl:apply-templates>
</xsl:variable>
<xsl:template match="//*[@NUM<=4]">
<elem key="{name()}">
<xsl:copy-of select="@*" />
<xsl:for-each select="@*">
<xsl:sort select="name()" />
<attribute>|<xsl:value-of select="name()" />|</attribute>
</xsl:for-each>
</elem>
</xsl:template>
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="msxsl:node-set($all_data)">
<xsl:for-each select="*[generate-id()=generate-id(key('elem_key',concat(@key, .))[1])]">
<table >
<tr>
<td>Element Name</td>
<xsl:for-each select="*">
<td>
<xsl:value-of select="translate(.,'|','')" />
</td>
</xsl:for-each>
</tr>
<xsl:for-each select="key('elem_key', concat(@key, .))">
<xsl:variable name="curr_elem" select="." />
<tr>
<td>
<xsl:value-of select="@key" />
</td>
<xsl:for-each select="*">
<td >
<xsl:value-of select="$curr_elem/@*[name()=translate(current(),'|','')]" />
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
<p />
</xsl:for-each>
</xsl:for-each>
</body>
</html>
</xsl:template>
L'expression XPath utilisée:
//*[@NUM<=4]
(Ci-dessus devrait générer beaucoup de résultats)
Les résultats incorrects je reçois:
Element Name name NUM
pets myPets 2
Comme vous pouvez le voir, il semble arrêter à la racine.
Si je change le XPath à:
//*[@NUM=4]
Je reçois ces résultats incorrects:
Element Name name NUM
dog Spot 4
Element Name name NUM
cat Lucy 4
Element Name name NUM
cat allMyCats 4
Ce qui semble se passer est qu'il arrête la recherche vers le bas dans la hiérarchie une fois qu'il a trouvé une rencontre. Les deux premiers (Spot et Lucy) sont corrects, mais ils s'arrêtent à allMyCats, quand il y a un nœud enfant de allMyCats (Simba) qui a un NUM de 4.
Quelqu'un peut-il m'aider à corriger ce code afin qu'il renvoie les résultats corrects? Je suis assez frustré! :(
Merci!
sans feuille de style complète, je peux seulement deviner ... Si var 'all_data' est déclarée comme élément supérieur d'une feuille de style, alors je suggère d'utiliser un chemin absolu dans' xsl: apply-templates' comme "/ *" –
@ Alejandro: le est le premier élément de la feuille de style, puis le var all_data. J'ai essayé le chemin "/ *" mais cela n'a pas affecté mes résultats. :( –
developer
Bonne question (+1) .Voir ma réponse pour l'explication du problème et pour une solution simple. :) –