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í :
Dentro de [y] no hay predicado : el operador "=" necesita dos argumentos, pero solo se proporciona uno.
.[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>
XSLT tiene una función especialmente para este problema.