Actualización:Esta respuesta responde al requisito establecido en el título de la pregunta original, "averiguar si el último nodo hijo es un nodo de texto". Pero el cuerpo de la pregunta sugiere un requisito diferente, y parece que el último requerimiento fue el deseado por el PO.
Las dos respuestas anteriores prueban explícitamente si el último elemento secundario es un elemento bar
, en lugar de probar directamente si se trata de un nodo de texto. Esto es correcto si foo contiene solo "nodos de texto mixto y elementos de barra" y nunca tiene cero hijos.
Pero es posible que desee probar directamente si el último hijo es un nodo de texto:
- Para facilitar la lectura de la lógica de estilo
- En caso de que el elemento contiene otros niños, además de los elementos y el texto: por ejemplo, comentarios o instrucciones de procesamiento
- En caso de que el elemento no tiene hijos
Tal vez usted sabe que los dos últimos no se producirá en su caso (pero a partir de su pregunta me imagino que podría nº 3). O tal vez lo creas, pero no estás seguro, o tal vez no lo has pensado. En cualquiera de los casos, es más seguro para probar directamente para lo que realmente quiere saber:
test="node()[last()]/self::text()"
Por lo tanto, sobre la base @ código de ejemplo de Dimitre y de entrada, la siguiente entrada XML:
<root>
<foo>some text <bar/> and maybe some more</foo>
<foo>some text <bar/> and a pi: <?foopi param=yes?></foo>
<foo>some text <bar/> and a comment: <!-- baz --></foo>
<foo>some text and an element: <bar /></foo>
<foo noChildren="true" />
</root>
Con esta XSLT plantilla:
<xsl:template match="foo">
<xsl:choose>
<xsl:when test="node()[last()]/self::text()">
<xsl:text>text at the end; </xsl:text>
</xsl:when>
<xsl:when test="node()[last()]/self::*">
<xsl:text>element at the end; </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>neither text nor element child at the end; </xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
rendimientos:
text at the end;
neither text nor element child at the end;
neither text nor element child at the end;
element at the end;
neither text nor element child at the end;
Buena pregunta (+1). Vea mi respuesta para una solución corta y una sugerencia de estilo de escritura. :) –