2011-10-21 21 views
5

Usando MarkLogic pero esta es probablemente una pregunta genérica de XQuery.¿Cómo obtener elementos secundarios pero ninguno de sus hijos?

que tengo:

<library> 
    <books> 
    <book title="whatever"> 
     <publisher>Random</publisher> 
     ....more children 
    </book> 
    <book title="another"> 
     <publisher>Simon</publisher> 
     ....more children 
    </book> 
    ... 
    </books> 
</library> 

que desea devolver todos los libros [] elementos con atributos de su título, pero no quiere que ninguno de los hijos de libro, por ejemplo, [editor]. ¿Cómo logro esto de una manera ortodoxa y eficiente?

Pregunta correlacionada: a veces es posible que desee obtener algunos de los niños, pero no otros, p. Ej. obtener todos los elementos del libro y sus elementos secundarios editores, pero ninguno de los otros hijos.

Gracias.

Respuesta

4

El XQuery (en realidad un XPath, que es un subconjunto de XQuery) /library/books/book hace técnicamente lo que quiere - que devuelve un conjunto de elementos del libro, y nada más. Algunas API devolverán referencias a los elementos del libro y le permitirán decidir qué desea hacer con ellos, por ejemplo, mostrar sus títulos. Sin embargo, muchas herramientas y API copiarán estos elementos del libro junto con todo el subárbol enraizado en el libro, y en el caso de una base de datos, esto es muy a menudo el resultado que se transmitirá a través de la red desde el servidor al cliente. En este caso, no desea seleccionar los elementos del libro existentes, desea construir un documento nuevo que contenga un subconjunto de la información en los elementos del libro. Para ello se puede utilizar constructores de elementos en XQuery:

for $b in /library/books/book 
return <book title="{$b/@title}"/> 
+0

Gracias Michael! Este parece ser el enfoque más elegante, en mi opinión, al haber observado otras recomendaciones. – bethesdaboys

0

Echa un vistazo a la sintaxis de selección de XQuery en el siguiente enlace. La sintaxis de selección generalmente le permite tomar los elementos de datos que le interesan, formatearlo como lo desee y omitir cosas que no le interesan.

http://www.w3schools.com/xquery/xquery_select.asp

1

hay maneras probablemente más fácil ... pero creo que algo como esto copiará los atributos w/salida de los otros niños. Advertencia: código no probado

for $i in doc()//book 
return <book>{ 
    for $a in $i/@* 
    return $a 
}</book> 
+0

Gracias, esto es muy útil, ya que me proporciona una sensación de un enfoque más generalizado. – bethesdaboys

0

Creo que un poco mejor solución a Michael Kay sería no enumerar cada atributo deseado y hacerlo un poco más general. Lo que hay que notar es que /@ devuelve un atributo y no solo texto.

Por ejemplo:

for $book in /library/books/book return <book>{$book/@*}</book> 

o incluso más en general:

for $book in /library/books/book return element book {$book/@*} 
+2

. Tampoco es necesario que lo utilice. Puede usar una expresión de ruta como esta: /library/books/book/ {@ *}

+0

Me gusta la simplicidad de ese enfoque. Mi primera reacción, sin embargo, fue ¿por qué tienes un elemento en tu x-path? Creo que adoptaré este enfoque. Gracias. – Walt

Cuestiones relacionadas