Primera pregunta: ¿hay alguna manera de obtener el nombre de los atributos de un nodo?
<node attribute1="value1" attribute2="value2" />
Sí: Esta expresión XPath (cuando node
es el contexto (actual) nodo)):
name(@*[1])
produce el nombre del primer attri bute (el orden puede ser puesta en práctica - dependiente)
y esto XPath expresión (cuando node
es el contexto (actual) nodo)):
name(@*[2])
produce la nombre del segundo atributo (el orden puede ser dependiente de la implementación).
Segunda pregunta: ¿hay alguna manera de obtener atributos y valores como pares de valores? La situación es la siguiente:
<node attribute1="10" attribute2="0" />
quiero conseguir todos los atributos donde valor> 0 y de esta manera: "atributo1 = 10".
Esta expresión XPath (cuando el atributo nombrado "attribute1
" es el contexto (actual) del nodo)):
concat(name(), '=', .)
produce la cadena:
attribute1=value1
y esto XPath expresión (cuando el nodo node
es el contexto (actual) nodo)):
@*[. > 0]
selecciona todos los atributos de la nodo de contexto, cuyo valor es un número, mayor que 0.
En XPath 2.0 uno puede combinarlos en una sola expresión XPath:
@*[number(.) > 0]/concat(name(.),'=',.)
para obtener (en este caso particular) este resultado:
attribute1=10
Si está utilizando XPath 1.0, que es menos potente, podrás necesidad de integrar la expresión XPath en un lenguaje de alojamiento, tales como XSLT. El siguiente XSLT 1.0 thransformation:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:for-each select="@*[number(.) > 0]">
<xsl:value-of select="concat(name(.),'=',.)"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
cuando se aplica en este documento XML:
<node attribute1="10" attribute2="0" />
Produce exactamente el mismo resultado:
attribute1=10
Es FLOWR XPath 2 o 'por $ i en @ * [. > 0] return concat (nombre-local ($ i), "=", $ i) '¿está bien para XPath 1.0? – TheConstructor
@TheConstructor, XPath 2.0 y versiones posteriores. –