2009-02-10 18 views
26

Digamos que tengo un documento XML como esto:¿Cómo hacer referencia al valor del nodo actual en XSL para cada prueba?

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

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

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

¿Qué estoy haciendo incorrectamente?

+0

. [SomeBoolean] es sintácticamente válida en XPath 1.0. –

Respuesta

37

El uso de . puede, de hecho, referirse al nodo actual (o "contexto"), pero no del modo en que lo está utilizando aquí. En XPath, .[foo] no es una sintaxis válida; en su lugar, necesita usar self::node()[foo]. Además, el operador = necesita algo va a contrastar, en este caso el selector de text() acceder a 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 indica en las otras respuestas, sin embargo, a menos que su for-each está realizando otras operaciones, así, no es necesario para recorrer en absoluto y puede utilizar simplemente if para llevar a cabo la misma tarea:

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

Mientras que Ben ha respondido a su pregunta correctamente, utilizando para-cada uno es sin duda el enfoque general mal. Después de todo esto es XSLT. Así que busca probablemente más para algo como esto:

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

Verdadero; Supuse que OP estaba cortando la parte relevante de un bloque 'por-cada 'más grande, pero si eso es todo, sería mucho mejor usar este simple' si 'en su lugar. –

12

Estoy intentando fijar una condición que comprueba el valor del nodo actual en el fines de cada uno, pero estoy haciendo algo equivocada:

la primera cosa que es incorrecto es la sintaxis:

.[='1112'] 

hay dos cosas mal aquí:

  1. Dentro de [y] no hay ningún predicado: el operador "=" necesita dos argumentos, pero sólo se proporciona uno.

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

    self :: node() [condición]

La segunda cosa en el código proporcionado que puede ser mejorado es la instrucción <xsl:for-each>, que ISN' t necesario en absoluto; Una sola expresión XPath será suficiente.

Para resumir, una posible expresión XPath que se evalúa al valor booleano requerida es:

/books/book[. = '1112'] 

Si es realmente necesario que la condición de ser probado en el interior de la instrucción <xsl:for-each>, entonces una correcta XPath me gustaría utilizar la expresión es:

. = '1112' 

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

. = 1112 
+1

La expresión '. = '1112'' funcionó bien para mí. Gracias. –

+0

@HosamAly, eres bienvenido. –

1

prueba con este

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