2010-05-25 11 views
5

devo avere due documenti XML:XPath - Interrogazione di due documenti XML

xml1:

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

XML2:

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

che sto cercando di fare quanto segue:

Ottieni il valore di XML2/Author/AuthorName dove XML1/Book/@ id è uguale a XML2/Author/BookId.

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

Buona domanda (+1). Vedere la mia risposta per una soluzione XPath 1.o e XPath 2.x completa. –

risposta

4

Un'espressione XPath 1.0 non può fare riferimento a più di un documento XML, a meno che i riferimenti ai documenti aggiuntivi non siano stati impostati nel contesto del motore XPath dalla lingua di hosting. Ad esempio, se XSLT è la lingua di hosting, rende disponibile la sua funzione document() al motore XPath che ospita.

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

nota impegno, che anche il documento XML principale deve essere referenziato tramite un altro <xsl:variable>, chiamato qui $mainDoc.

La funzione è disponibile solo se Xpath è ospitato da XSLT! Questo non è menzionato nella risposta di Doc Brown e sta ingannando i lettori.

Un'espressione XPath 2.x può fare riferimento a qualsiasi documento XML aggiuntivo utilizzando la funzione XPath 2.0 doc().

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

Sto usando il ciclo di vita. Entrambi i file xml sono in memoria e sto cercando di restituire solo un set di risultati di xml. XSLT trasforma solo il lavoro su un file alla volta (dalla mia comprensione). – Arnej65

+0

@ Arnej65: una trasformazione XSLT può funzionare con * molti * documenti XML - utilizzando la funzione 'document()', una struttura temporanea o i documenti passati come parametri alla trasformazione. –

+0

Il processo xslt in livecycle può essere applicato solo a un documento alla volta. Ho unito i risultati e poi ho filtrato l'output finale con XSLT. Grazie per la soluzione. – Arnej65

0

La funzione document è tuo amico, here è un breve tutorial come combinare più file di input.

MODIFICA: Ovviamente, funziona solo se stai utilizzando Xpath in uno script Xslt.

+0

Sei consapevole che la funzione 'document()' è disponibile solo in XSLT? La domanda originale è nell'area XPath e XSLT non è previsto. Si prega di correggere la risposta. Così com'è, non fornisce una soluzione nel caso generale. –

+0

Alla fine vorrei prendere il "authorname" da XML2 e assegnare il valore a "authorname" in XML1. Sto sviluppando in Livecycle e potrei usare xslt per fare la transfor, ma hanno attività di flusso di lavoro dove puoi assegnare un valore usando xpath. – Arnej65

+0

@ Arnej65: non è possibile "assegnare il valore a" authorname "in XML1" con XSLT. Una trasformazione XSLT non può modificare il documento XML che sta trasformando: può creare solo un nuovo documento XML come risultato. –