2010-05-25 7 views
5

Ich habe zwei xml docs haben:XPath - Abfragen von zwei XML-Dokumente

XML1:

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

XML2:

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

Ich versuche, die folgendes zu tun:

Den Wert von XML2/Author/AuthorName erhalten, wobei XML1/Book/@ id gleich XML2/Author/BookId ist.

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

Gute Frage (+1). Siehe meine Antwort für eine vollständige XPath 1.o und XPath 2.x-Lösung. –

Antwort

4

Ein XPath 1.0-Ausdruck kann nicht auf mehr als ein XML-Dokument verweisen, sofern die Verweise auf die zusätzlichen Dokumente nicht im Kontext der XPath-Engine von der Hostsprache eingerichtet wurden. Wenn beispielsweise XSLT die Hostsprache ist, stellt sie ihre document()-Funktion für die XPath-Engine zur Verfügung, die sie hostet.

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

Zu beachten ist, dass auch die Haupt-XML-Dokument über einen anderen <xsl:variable> verwiesen werden muss, mit dem Namen hier $mainDoc.

Die Funktion document() ist nur verfügbar, wenn Xpath von XSLT gehostet wird! Dies wird in der Antwort von Doc Brown nicht erwähnt und führt die Leser irre.

Ein XPath 2.x-Ausdruck kann auf jedes zusätzliche XML-Dokument verweisen, das die Funktion XPath 2.0 doc() verwendet.

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

Ich benutze Livecycle. Beide XML-Dateien sind im Speicher und ich versuche, nur eine Ergebnismenge von XML zurückzugeben. XSLT-Transformationen funktionieren nur für jeweils eine Datei (nach meinem Verständnis). – Arnej65

+0

@ Arnej65: Eine XSLT-Transformation kann mit * vielen * XML-Dokumenten arbeiten - mit der Funktion 'document()', einem temporären Baum oder Dokumenten, die als Parameter an die Umwandlung übergeben werden. –

+0

Der xslt-Prozess im Live-Zyklus kann immer nur auf ein Dokument angewendet werden. Ich habe die Ergebnisse kombiniert und dann die endgültige Ausgabe mit XSLT gefiltert. Danke für Ihre Lösung. – Arnej65

0

Die document Funktion ist dein Freund, here eine kurze Anleitung, wie mehrere Input-Dateien zu kombinieren.

EDIT: Natürlich funktioniert das nur, wenn Sie Xpath in einem Xslt-Skript verwenden.

+0

Ist Ihnen bekannt, dass die 'document()' Funktion nur in XSLT verfügbar ist? Die ursprüngliche Frage ist im Bereich von XPath und XSLT wird nicht erwartet. Bitte korrigieren Sie Ihre Antwort. So wie es ist, bietet es im allgemeinen Fall keine Lösung. –

+0

Am Ende möchte ich den 'authornname' von XML2 nehmen und den Wert 'authorname' in XML1 zuweisen. Ich entwickle mich in Livecycle und könnte xslt verwenden, um den Transformer zu erstellen, aber sie verfügen über Arbeitsablaufaktivitäten, denen Sie mithilfe von xpath Werte zuweisen können. – Arnej65

+0

@ Arnej65: Sie können den Wert für 'Autorenname' in XML1 nicht mit XSLT zuweisen. Eine XSLT-Transformation kann das XML-Dokument, das transformiert wird, nicht ändern. Es kann nur ein neues XML-Dokument als Ergebnis erstellen. –