2010-05-25 14 views
5

tengo dos documentos XML:XPath - Consulta de dos documentos XML

XML1:

<Books> 
    <Book id="11"> 
      ....... 
      <AuthorName/> 
    </Book> 
    ...... 
</Books> 

xml2:

<Authors> 
    <Author> 
      <BookId>11</BookId> 
      <AuthorName>Smith</AuthorName> 
    </Author> 
</Authors> 

que estoy tratando de hacer lo siguiente:

Obtenga el valor de XML2/Author/AuthorName donde XML1/Book/@ id es igual a XML2/Author/BookId.

XML2/Author/AuthorName[../BookId = XML1/Book/@id] 
+0

Buena pregunta (+1). Vea mi respuesta para una solución completa de XPath 1.o y XPath 2.x. –

Respuesta

4

Una expresión XPath 1.0 no puede hacer referencia a más de un documento XML, a menos que el lenguaje de hospedaje haya configurado las referencias a los documentos adicionales en el contexto del motor XPath. Por ejemplo, si XSLT es el lenguaje de alojamiento, entonces hace que su función document() esté disponible para el motor XPath que está hospedando.

document($xml2Uri)/Authors/Author[BookId = $mainDoc/Books/Book/@id] 

hacer la nota, que incluso el principal documento XML debe ser referenciada a través de otro <xsl:variable>, llamado aquí $mainDoc.

La función document() está disponible solo si Xpath aloja Xpath en Xpath. Esto no se menciona en la respuesta de Doc Brown y está engañando a los lectores.

expresión 2.x Un XPath puede referirse a cualquier documento XML adicional utilizando la función de XPath 2.0 doc().

for $doc in /, 
    $doc2 in doc(someUri) 
    return 
    $doc2/Authors/Author[BookId = $doc/Books/Book/@id] 
+0

Estoy usando livecycle. Ambos archivos xml están en memoria y estoy tratando de devolver solo un conjunto de resultados de xml. XSLT solo transforma el trabajo en un archivo a la vez (según tengo entendido). – Arnej65

+0

@ Arnej65: una transformación XSLT puede funcionar con * muchos * documentos XML, utilizando la función 'document()', un árbol temporal o documentos pasados ​​como parámetros para la transformación. –

+0

El proceso xslt en livecycle solo se puede aplicar a un documento a la vez. Combiné los resultados y luego filtré el resultado final con XSLT. Gracias por tu solución. – Arnej65

0

La función document es su amigo, here es un breve tutorial cómo combinar varios archivos de entrada.

EDITAR: Por supuesto, eso funciona solo si estás usando Xpath en un script Xslt.

+0

¿Sabía que la función 'document()' solo está disponible en XSLT? La pregunta original está en el área de XPath y no se espera XSLT. Por favor, corrija su respuesta. Tal como está, no proporciona una solución en el caso general. –

+0

Al final me gustaría tomar el 'nombre de autor' de XML2 y asignar el valor a 'nombre de autor' en XML1. Estoy desarrollando en Livecycle y podría usar xslt para hacer el cambio, pero tienen actividades de flujo de trabajo donde puedes asignar valor usando xpath. – Arnej65

+0

@ Arnej65: No puede "asignar el valor a 'authorname' en XML1" con XSLT. Una transformación XSLT no puede cambiar el documento XML que está transformando; puede crear solo un nuevo documento XML como resultado. –

Cuestiones relacionadas