/ / Compruebe si el padre tiene texto fuera de sus hijos - xslt, xpath

Compruebe si el padre tiene texto fuera de sus hijos - xslt, xpath

Tengo un XML similar a este:

<parent>
<child>child"s text</child>
<child>other child"s text</child>
parent"s text
</parent>

Tenga en cuenta que está permitido tener varios elementos secundarios.

Me gustaría saber si el elemento padre tiene texto fuera de sus hijos.

He encontrado esta solución:

<xsl:if test="normalize-space(parent/child[1]) = normalize-space(parent)">
<xsl:text>No parent text</xsl:text>
</xsl:if>

yo suelo parent/child[1] porque la función de espacio normalizado no acepta una secuencia como su argumento.

¿Hay una mejor manera de hacer esto?

(He encontrado esta pregunta sobre el tema pero la respuesta es incorrecta o la pregunta es diferente)

Respuestas

1 para la respuesta № 1

Utilizar text() para referirse explícitamente a los nodos de texto.

La mejor manera de hacer esto es:

<xsl:if test="parent/text()[not(parent::child)]">
<!--This parent element has text nodes-->
</xsl:if>

O bien, podría escribir una plantilla separada:

<xsl:template match="text()[parent::parent]">
<xsl:text>parent element with text nodes!</xsl:text>
</xsl:template>

1 para la respuesta № 2

Esta plantilla:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:choose>
<xsl:when test="parent/child::text()">
true
</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

cuando se aplica a su entrada XML, devuelve

true

cuando se aplica en el siguiente XML:

<?xml version="1.0" encoding="utf-8"?>
<parent>
<child>child"s text</child>
<child>other child"s text</child>
</parent>

devoluciones

false