2009-12-07 11 views
5

Por favor, ayúdenme chicos. Solo intento declarar un fragmento de árbol de resultados simple e iterar sobre él.XSL msxsl: problema de conjunto de nodos


...

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

...


¿Estoy completamente equivocado acerca de cómo funciona esto?


Editar: estoy usando .NET XslCompiledTransform y tienen los msxsl correctas declaraciones de espacios - xmlns: msxsl = "urn: schemas-microsoft-com: XSLT"

La Central de transformación ejecuta fina - El problema es que nada es salida

+0

no creo que eso es suficiente código dentro y fuera de sí a cualquier cosa en realidad la salida ... – Murph

+0

I' No estoy muy seguro de lo que quiere decir, pero este es un fragmento de todo el archivo xslt. Todo por encima y por debajo de las salidas está bien. Es simplemente el rtf y el conjunto de nodos que no se comportan como se esperaba. – Maleks

Respuesta

8

Mi sospecha es que tiene un espacio de nombres por defecto declarado en su hoja de estilo. Eso colocaría efectivamente los elementos < item-list> y < item> en un espacio de nombres. Para seleccionar elementos calificados para espacios de nombres usando XPath 1.0, siempre debe usar un prefijo en la expresión.

Así que si usted tiene algo como esto en la parte superior de la hoja de estilos:

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

entonces tendrá que añadir también esto:

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

Y a continuación, utilizar el prefijo "x" en su expresión XPath:

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

Avíseme si eso fue el truco. Solo estoy especulando aquí.

+0

Genius. Funciona un placer – Maleks

+0

¡su especulación es correcta! – Safor

1

Esto se ve bien para mí.

¿Ha declarado correctamente el espacio de nombres msxsl para las funciones de extensión? Algo como esto:

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

estoy asumiendo que usted está utilizando el procesador XSLT Microsoft aquí

+0

Sí, utilizando tecnologías de MS y con el espacio de nombres correcto registrado. – Maleks

4

A diferencia msxsl, XslCompiledTransform proporciona node-set() función de donde es supposed to be - en EXSLT espacio de nombre común:

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

Gracias por el aviso. – Maleks

+0

@Pavel Minaev ¡Muchas gracias! Yo uso xslt y python y en mi caso, fue una gran solución. – daikini

Cuestiones relacionadas