xsl transformar programacion online generate generar from freeformater ejemplos ejemplo codigo archivo xml xslt xpath

xml - transformar - xsl ejemplos



¿Cómo hacer referencia al valor actual del nodo en XSL para cada prueba? (5)

Digamos que tengo un documento XML como este:

<books> <book>1110</book> <book>1111</book> <book>1112</book> <book>1113</book> </books>

Estoy tratando de configurar una condición que pruebe el valor del nodo actual en el for-each , pero estoy haciendo algo mal:

<xsl:for-each select="/books/book"> <xsl:if test=".[=''1112'']"> Success </xsl:if> </xsl:for-each>

¿Qué estoy haciendo incorrectamente?


Estoy tratando de configurar una condición que pruebe el valor del nodo actual en el for-each, pero estoy haciendo algo mal:

Lo primero que es incorrecto es la sintaxis :

.[=''1112'']

Hay dos cosas mal aquí :

  1. Dentro de [y] no hay predicado : el operador "=" necesita dos argumentos, pero solo se proporciona uno.

  2. .[x = y] sigue siendo una sintaxis no válida, aunque el predicado es correcto . Esto debe ser especificado como:

    self :: node () [condición]

Lo segundo en el código proporcionado que se puede mejorar es la instrucción <xsl:for-each> , que no es necesaria en absoluto; Una sola expresión XPath será suficiente.

En resumen , una posible expresión XPath que evalúa el valor booleano requerido es:

/books/book[. = ''1112'']

Si es realmente necesario que la condición se pruebe dentro de la instrucción <xsl:for-each> , entonces una expresión XPath correcta que utilizaría es:

. = ''1112''

Lo anterior es una comparación de cadenas y no puede evaluar a true() si hay espacios alrededor. Por lo tanto, una comparación numérica puede ser mejor :

. = 1112


Prueba con esto

<xsl:for-each select="/books/book"> <xsl:if test="current() = ''1112''"> Success </xsl:if> </xsl:for-each>


Si bien Ben ha respondido correctamente a su pregunta, usar for-each es sin duda el enfoque general equivocado. Después de todo esto es XSLT. Entonces probablemente estés más buscando algo como esto:

<xsl:if test="/books/book[text()=''1112'']"> Success </xsl:if>


Usando . puede, de hecho, referirse al nodo actual (o "contexto"), pero no de la manera en que lo está usando aquí. En XPath .[foo] no es una sintaxis válida; en su lugar, debe usar self::node()[foo] . Además, el operador = necesita algo con lo que hacer coincidir, en este caso el selector de text() para acceder a los contenidos de texto del elemento:

<xsl:for-each select="/books/book"> <xsl:if test="self::node()[text()=''1112'']"> Success </xsl:if> </xsl:for-each>

Como se indicó en las otras respuestas, sin embargo, a menos que su for-each esté realizando otras operaciones, no necesita iterar en absoluto y puede usar solo if desea realizar la misma tarea:

<xsl:if test="/books/book[. = 1112]"> Success </xsl:if>