regulares online herramienta expresiones ejemplos consultas attribute xml xslt xpath

xml - herramienta - xpath online



Expresión XSL/XPath para comprobar si un nodo contiene al menos un elemento secundario no vacío (4)

Necesito comprobar si un nodo XML tiene al menos un elemento secundario no vacío. Aplicado a este XML, la expresión debería ser true

<xml> <node> <node1/> <node2/> <node3>value</node3> </node> </xml>

Traté de usar esta expresión: <xsl:if test="not(/xml/node/child::* = '''')"> pero parece comprobar si todos los elementos <xsl:if test="not(/xml/node/child::* = '''')"> no están vacíos.

¿Cómo puedo escribir una expresión que devuelve true si al menos un elemento no está vacío? ¿Hay alguna manera de hacer esto sin crear otra plantilla para iterar sobre el nodo chldren?

UPD: estoy pensando en contar nodos vacíos como
test="count(not(/xml/node/child::* = '''')) &gt; ''0''"
pero de alguna manera simplemente no puede hacer que funcione bien. Esta expresión no es bien formada.


Aquí hay una XPath que debería realizar el trabajo:

count(/*/node/*[text()]) &gt; 0

Cuando se usa en una muestra XSLT:

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="/"> <xsl:value-of select="count(/*/node/*[text()]) &gt; 0" /> </xsl:template> </xsl:stylesheet>

... que, a su vez, se aplica al ejemplo XML proporcionado:

<xml> <node> <node1/> <node2/> <node3>value</node3> </node> </xml>

... el resultado esperado se produce:

true

Si aplicamos el mismo XSLT contra un XML simplemente modificado:

<xml> <node> <node1/> <node2/> <node3/> </node> </xml>

... otra vez, se produce el resultado esperado:

false

Explicación:

El XPath utilizó búsquedas para todos los elementos secundarios de un elemento <node> (que a su vez son elementos secundarios del elemento raíz) que tienen un valor de texto no vacío (como lo especifica el text() ); si el recuento de tales hijos <node> es mayor que 0, entonces el XPath se convierte en true .


Solo necesita <xsl:if test="/xml/node/* != ''''" /> .

En XPath an = o != Comparación donde un lado es un conjunto de nodos y el otro lado es una cadena que tiene éxito si cualquiera de los nodos en el conjunto pasa la comparación. Así

not(x = '''')

significa que "no es el caso que cualquier elemento hijo x del nodo actual tenga un valor de cadena vacío", que es fundamentalmente diferente de

x != ''''

lo que significa que "al menos un elemento hijo x del nodo actual tiene un valor de cadena que no está vacío". En particular, si desea verificar que todos los x hijos estén vacíos, debe usar una prueba "doble negativa"

not(x != '''')


Más preciso, más simple y más eficiente (no es necesario usar la función count() ) :

/*/node/*[text()]

Si desea excluir cualquier elemento que solo tenga texto en el espacio en blanco, use:

/*/node/*[normalize-space()]


<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="/"> <xsl:value-of select="/*/node/*[string-length(text()) &gt;0]!=''''"/> </xsl:template> </xsl:stylesheet>

Explicación Esto encontrará el primer nodo con una longitud de cadena mayor que cero y luego compara dicho contenido de nodo con cadena vacía (la comparación devolverá la existencia de un nodo de cadena no vacío); este código también se puede usar para buscar un criterio específico en cualquier nodo, por ejemplo, identificar la existencia de un nodo que contiene una cadena específica o comienza con algún carácter o cualquier otra condición; por favor use esto como la condición interna de la referencia del nodo para que el código haga su magia.