2011-10-27 33 views
5

he utilizado XPath para seleccionar el nodo con el mayor valor entero Identificación antes de usar esta consulta:¿Cómo selecciono un nodo XML con el valor más largo del nodo #texto hijo con XPath?

//somenode[not(@id <= preceding::somenode/@id) and not(@id <= following::somenode/@id)] 

Tenía la esperanza de que pudiera hacer algo similar como:

//entry[not(string-length(child::text()) <= string-length(preceding::entry/child::text())) and not(string-length(child::text()) <= string-length(following::entry/child::text()))] 

pero vuelve un grupo de nodos en lugar de solo uno.

XML

muestra:

<xml> 
    <entry>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</entry> 
    <entry>Nam dignissim mi a massa mattis rutrum eu eget mauris.</entry> 
    <entry>Ut at diam a sem scelerisque pretium nec pulvinar purus.</entry> 
    <entry>Nunc in nisi nec dolor accumsan suscipit vel a quam.</entry> 
    <entry>Nunc suscipit lobortis arcu, nec adipiscing libero bibendum nec.</entry> 
    <entry>Aenean eget ipsum et nunc eleifend scelerisque.</entry> 
    <entry>In eu magna et diam volutpat molestie.</entry> 
    <entry>In volutpat luctus mi, eu laoreet orci dictum vel.</entry> 
    <entry>In mattis mi nec magna sodales eu bibendum felis aliquet.</entry> 
<!-- etc for 800 more lines or so --> 
    <entry>Duis auctor felis id neque gravida ut auctor ipsum ullamcorper.</entry> 
    <entry>Sed vel tortor mauris, et aliquet tellus.</entry> 
</xml> 

prueba XPath: http://chris.photobooks.com/xml/default.htm?state=1o

Respuesta

2

El elemento (s) deseada no se puede seleccionar con un solo XPath 1.0 expresión, porque en XPath 1.0 que no es posible aplicar una función para todos los nodos seleccionados (string-length(someNodeSet) se aplica solo en el primer nodo de este conjunto de nodos). Otra razón es que en XPath 1.0 no es posible nombrar y referenciar variables de rango.

En XPath 2.0 Esto es trivial:

/*/entry[not(string-length(.) &lt; /*/entry/string-length(.))] 

Los selecciona por encima de todos los entry elementos de la longitud de cuyo valor de cadena es el de máxima.

/*/entry[not(string-length(.) &lt; /*/entry/string-length(.))] [1] 

Lo anterior se selecciona la primera (en orden documento) tal elemento entry.

XSLT 2,0 - verificación basada:

Esta transformación:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
    <xsl:sequence select= 
    "/*/entry[not(string-length(.) &lt; /*/entry/string-length(.))]"/> 
</xsl:template> 
</xsl:stylesheet> 

cuando se aplica en el documento XML proporcionado:

<xml> 
    <entry>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</entry> 
    <entry>Nam dignissim mi a massa mattis rutrum eu eget mauris.</entry> 
    <entry>Ut at diam a sem scelerisque pretium nec pulvinar purus.</entry> 
    <entry>Nunc in nisi nec dolor accumsan suscipit vel a quam.</entry> 
    <entry>Nunc suscipit lobortis arcu, nec adipiscing libero bibendum nec.</entry> 
    <entry>Aenean eget ipsum et nunc eleifend scelerisque.</entry> 
    <entry>In eu magna et diam volutpat molestie.</entry> 
    <entry>In volutpat luctus mi, eu laoreet orci dictum vel.</entry> 
    <entry>In mattis mi nec magna sodales eu bibendum felis aliquet.</entry> 
<!-- etc for 800 more lines or so --> 
    <entry>Duis auctor felis id neque gravida ut auctor ipsum ullamcorper.</entry> 
    <entry>Sed vel tortor mauris, et aliquet tellus.</entry> 
</xml> 

selecciona los entry elementos (en este caso solo uno) con t lo máximo cadena de longitud y da salida a los elementos seleccionados:

<entry>Nunc suscipit lobortis arcu, nec adipiscing libero bibendum nec.</entry> 
+0

creo que se está perdiendo algo en esa segunda consulta, un '[1]' en el extremo tal vez? – travis

+0

@travis: Buena captura - Estoy un poco fuera de foco esta noche. Corregido –

+2

+1 - * "(string-length (someNodeSet) se aplica solo en el primer nodo de este conjunto de nodos)" * - Cometí un error tonto y luego fui engañado por muy pocos casos de prueba. Esta es la mejor respuesta. –

Cuestiones relacionadas