2009-12-07 12 views
5

Bitte helfen Sie mir Jungs. Ich versuche nur, ein einfaches Ergebnisbaumfragment zu deklarieren und darüber zu iterieren.XSL msxsl: Knoten-Set Problem


...

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

...


Bin ich völlig falsch, wie das funktioniert?


Edit: I .NET XslCompiledTransform bin mit und haben die richtigen msxsl Namespace-Deklarationen - xmlns: msxsl = "urn: schemas-microsoft-com: xslt"

Die transformating führt Fein - das Problem ist, dass nichts ausgegeben wird

+0

Ich glaube nicht, dass thats genug Code in und aus sich tatsächlich ausgegeben alles ... – Murph

+0

I‘ m nicht wirklich sicher, was du meinst, aber das ist ein Ausschnitt der gesamten xslt-Datei. Alles über und unter gibt gut aus. Es ist lediglich das rtf und die Knotenmenge, die sich nicht wie erwartet verhalten. – Maleks

Antwort

8

Mein Verdacht verwenden, ist, dass Sie eine Standard-Namespace in Ihrem Stylesheet deklariert haben. Das würde die Elemente < item-list> und < item> effektiv in einen Namespace stellen. Um Namespace-qualifizierte Elemente mithilfe von XPath 1.0 auszuwählen, müssen Sie immer einen Präfix im Ausdruck verwenden.

Also, wenn Sie so etwas wie dies an der Spitze Ihres Sheet haben:

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

Dann müssen Sie auch diese hinzufügen:

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

Und dann verwenden Sie das "x" prefix in Ihrem XPath-Ausdruck:

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

Lassen Sie mich wissen, wenn das den Trick tat. Ich spekuliere nur hier.

+0

Genie. Funktioniert gut. – Maleks

+0

Ihre Spekulation ist richtig! – Safor

1

Das sieht OK für mich aus.

Haben Sie den msxsl-Namespace für die Erweiterungsfunktionen korrekt deklariert? Etwas wie folgt aus:

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

Ich gehe davon aus Sie den Microsoft XSLT-Prozessor hier

+0

Ja, mit MS-Technologien und haben den richtigen Namensraum registriert. – Maleks

4

Im Gegensatz zu MSXSL, XslCompiledTransform bietet node-set() Funktion, wo es supposed to be ist - in EXSLT gemeinsamen Namensraum:

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

Danke für die Köpfe hoch. – Maleks

+0

@Pavel Minaev Vielen Dank! Ich benutze xslt und python und in meinem Fall war es eine großartige Lösung. – daikini