Prima domanda: c'è un modo per ottenere il nome degli attributi di un nodo?
<node attribute1="value1" attribute2="value2" />
Si: Questa espressione XPath (ove node
è contesto (corrente) node)):
name(@*[1])
produce il nome del primo attri bute (l'ordine può essere attuazione - dipendente)
e questo XPath espressione (ove node
è contesto (corrente) node)):
name(@*[2])
produce la nome del secondo attributo (l'ordine può essere dipendente dall'implementazione).
Seconda domanda: c'è un modo per ottenere gli attributi e i valori come coppie di valori? La situazione è la seguente:
<node attribute1="10" attribute2="0" />
voglio ottenere tutti gli attributi in cui valore> 0 e in questo modo: "attribute1 = 10".
Questa espressione XPath (quando l'attributo nome "attribute1
" è il contesto (corrente) node)):
concat(name(), '=', .)
produce la stringa:
attribute1=value1
e questo XPath espressione (quando il nodo node
è il contesto (corrente) node)):
@*[. > 0]
seleziona tutti gli attributi nodo contesto, il cui valore è un numero maggiore di 0.
In XPath 2.0 li può combinare in un'unica espressione XPath:
@*[number(.) > 0]/concat(name(.),'=',.)
per arrivare (in questo caso particolare) questo risultato:
attribute1=10
Se si utilizza XPath 1.0, che è meno potente, avrete bisogno di incorporare l'espressione XPath in una lingua di hosting, come ad esempio XSLT. Il seguente 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>
se applicato su questo documento XML:
<node attribute1="10" attribute2="0" />
Produce esattamente lo stesso risultato:
attribute1=10
FLOWR XPath 2 o 'per $ i in @ * [. > 0] return concat (local-name ($ i), "=", $ i) 'be ok per XPath 1.0? – TheConstructor
@TheConstructor, XPath 2.0 e versioni successive. –