2009-03-29 9 views
6

Primera pregunta: ¿hay alguna forma de obtener el nombre de los atributos de un nodo?Pregunta de XPath 1 y nombre de atributos

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

Segunda pregunta: ¿hay alguna forma 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 el valor> 0 y de esta manera: "atributo1 = 10".

Respuesta

10

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

+0

Es FLOWR XPath 2 o 'por $ i en @ * [. > 0] return concat (nombre-local ($ i), "=", $ i) '¿está bien para XPath 1.0? – TheConstructor

+0

@TheConstructor, XPath 2.0 y versiones posteriores. –

0

Depende un poco del contexto, creo. En la mayoría de los casos, espero que tengas que consultar "@*", enumerar los elementos y llamar al "name()", pero puede funcionar en algunas pruebas.

la edición Re - que puede hacer:

@*[number(.)>0] 

para encontrar atributos que coinciden con sus criterios, y:

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

para mostrar la salida. Sin embargo, no creo que puedas hacer ambas cosas a la vez. ¿Cuál es el contexto aquí? xslt? ¿Qué?

+0

Hola Mark, gracias por la respuesta rápida. ¿Hay alguna forma de obtener atributos y nombres como pares de valores? Hmm ... tal vez debería editar mi pregunta. –

+0

Hoy estoy usando la biblioteca XFactorStudio XPath 1 y ActionScript 2. –

+0

Luego, creo que tendrá que hacer el filtro y la proyección por separado (como se indica arriba, o la proyección según corresponda para el entorno). –

3

//node/attribute::*

probé uso de la web basado XPath Evaluador here.

Utilice el XML que desea tener con el nodo de muestra que ha proporcionado.
Ponga la Expresión de XPath en la página & haga clic en Evaluar.

Espero que esto ayude.

Cuestiones relacionadas