2009-12-07 6 views
5

S'il vous plaît aidez-moi les gars. J'essaie juste de déclarer un fragment d'arbre de résultat simple et de le parcourir.XSL msxsl: problème nœud-set


...

<xsl:variable name="rtf"> 
    <item-list> 
    <item id="1">one</item> 
    <item id="2">two</item> 
    <item id="3">three</item> 
    <item id="4">four</item> 
    </item-list> 
</xsl:variable> 

<xsl:for-each select="msxsl:node-set($rtf)/item-list/item"> 
    <xsl:value-of select="@id"/> 
</xsl:for-each> 

...


Suis-je complètement trompé sur la façon dont cela fonctionne?


Edit: J'utilise XslCompiledTransform .NET et ont les déclarations d'espace de noms msxsl correct - xmlns: msxsl = "urn: schemas-microsoft-com: xslt"

Le transformating exécute bien - le problème est que rien n'est sorti

+0

Je ne pense pas que des thats assez de code et de lui-même pour quoi que ce soit sortie ... – Murph

+0

I » Je ne suis pas vraiment sûr de ce que vous voulez dire, mais c'est un extrait de l'ensemble du fichier xslt. Tout ce qui est au-dessus et au-dessous produit bien. C'est simplement le rtf et l'ensemble de nœuds qui ne se comportent pas comme prévu. – Maleks

Répondre

8

Je soupçonne que vous avez un espace de noms par défaut déclaré dans votre feuille de style. Cela placerait effectivement les éléments < item-list> et < item> dans un espace de noms. Pour sélectionner des éléments qualifiés pour l'espace de noms à l'aide de XPath 1.0, vous devez toujours utiliser un préfixe dans l'expression.

Donc, si vous avez quelque chose comme ça en haut de votre feuille de style:

<xsl:stylesheet xmlns="http://example.com"...> 

Ensuite, vous aurez besoin d'ajouter aussi ceci:

<xsl:stylesheet xmlns="http://example.com" xmlns:x="http://example.com"...> 

Et puis utilisez le préfixe « x » dans votre expression XPath:

<xsl:for-each select="msxsl:node-set($rtf)/x:item-list/x:item"> 
    <xsl:value-of select="@id"/> 
</xsl:for-each> 

Faites-moi savoir si cela a fait l'affaire. Je ne fais que spéculer ici.

+0

Génie. Fonctionne un régal. – Maleks

+0

votre spéculation est juste! – Safor

1

Cela me semble OK.

Avez-vous correctement déclaré l'espace de noms msxsl pour les fonctions d'extension? Quelque chose comme ceci:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 

Je suppose que vous utilisez le processeur XSLT Microsoft ici

+0

Oui, en utilisant les technologies MS et l'espace de nom correct est enregistré. – Maleks

4

Contrairement msxsl, XslCompiledTransform fournit la fonction node-set() où il est supposed to be - dans EXSLT espace de nom commun:

<xsl:stylesheet xmlns:exslt="http://exslt.org/common"> 
    ... 
    <xsl:for-each select="exslt:node-set($rtf)/item-list/item"> 
    ... 
</xsl:stylesheet> 
+0

Merci pour les heads up. – Maleks

+0

@Pavel Minaev Merci beaucoup! J'utilise xslt et python et dans mon cas, c'était une excellente solution. – daikini

Questions connexes