2009-03-29 16 views
6

Prima domanda: c'è un modo per ottenere il nome degli attributi di un nodo?XPath 1 nome query e attributi

<node attribute1="value1" attribute2="value2" /> 

Seconda domanda: c'è un modo per ottenere attributi e valori come coppie di valori? La situazione è la seguente:

<node attribute1="10" attribute2="0" /> 

voglio ottenere tutti gli attributi in cui il valore> 0 e in questo modo: "attribute1 = 10".

risposta

10

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

+0

FLOWR XPath 2 o 'per $ i in @ * [. > 0] return concat (local-name ($ i), "=", $ i) 'be ok per XPath 1.0? – TheConstructor

+0

@TheConstructor, XPath 2.0 e versioni successive. –

0

Dipende un po 'dal contesto, credo. Nella maggior parte dei casi, mi aspetto che tu debba richiedere "@*", enumerare gli articoli e chiamare "name()", ma potrebbe funzionare in alcuni test.

Re la modifica - che si può fare:

@*[number(.)>0] 

per trovare gli attributi corrispondono ai vostri criteri, e:

concat(name(),'=',.) 

per visualizzare l'output. Non penso che tu possa fare entrambe le cose contemporaneamente, però. Qual è il contesto qui? xslt? che cosa?

+0

Ciao Mark, grazie per la rapida risposta. C'è un modo per ottenere attributi e nomi come coppie di valori? Hmm ... forse dovrei modificare la mia domanda. –

+0

Oggi utilizzo XFactorStudio XPath 1 library e ActionScript 2. –

+0

Quindi credo che si dovrà fare il filtro e la proiezione separatamente (come sopra, o la proiezione appropriata per l'ambiente). –

3

//node/attribute::*

provato utilizzando il web basato XPath Evaluator here.

Utilizzare l'XML che si desidera avere il nodo campione fornito.
Inserire l'espressione XPath nella pagina & fare clic su Eval.

Spero che questo aiuti.

Problemi correlati