2009-12-07 14 views
5

Per favore aiutatemi ragazzi. Sto solo cercando di dichiarare un semplice frammento di albero dei risultati e iterare su di esso.XSL msxsl: problema set-nodo


...

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

...


sono io completamente sbagliato su come funziona?


Edit: sto usando .NET XslCompiledTransform ed avere le giuste dichiarazioni di namespace msxsl - xmlns: msxsl = "urn: schemas-microsoft-com: XSLT"

Il transformating esegue bene - il problema è che non viene emesso nulla

+0

non credo che questo è il codice abbastanza dentro e fuori sé a qualsiasi cosa in realtà uscita ... – Murph

+0

I' Non sono sicuro di cosa intendi, ma questo è un frammento dell'intero file xslt. Tutto sopra e sotto produce bene. È semplicemente il rtf e il nodo-set che non si comportano come previsto. – Maleks

risposta

8

Il mio sospetto è che si ha uno spazio dei nomi predefinito dichiarato nel foglio di stile. In tal modo, gli elementi < item> list e < item vengono posizionati in modo efficace in uno spazio dei nomi. Per selezionare gli elementi qualificati nello spazio dei nomi utilizzando XPath 1.0, è necessario utilizzare sempre un prefisso nell'espressione.

Quindi, se avete qualcosa di simile nella parte superiore del foglio di stile:

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

allora avrete bisogno di aggiungere anche questo:

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

e quindi utilizzare il prefisso "x" nell'espressione XPath:

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

Fammi sapere se questo ha fatto il trucco. Sto solo speculando qui.

+0

Genius. Funziona a meraviglia. – Maleks

+0

la tua speculazione è giusta! – Safor

1

Questo mi sembra OK.

Hai comunque dichiarato correttamente lo spazio dei nomi msxsl per le funzioni di estensione? Qualcosa di simile a questo:

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

Io parto dal presupposto che si sta utilizzando il processore XSLT Microsoft qui

+0

Sì, usando le tecnologie MS e avere lo spazio dei nomi corretto registrato. – Maleks

4

differenza msxsl, XslCompiledTransform fornisce node-set() funzione in cui è supposed to be - in EXSLT namespace comune:

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

Grazie per l'avviso. – Maleks

+0

@Pavel Minaev Grazie mille! Io uso xslt e python e nel mio caso è stata un'ottima soluzione. – daikini