2010-05-25 11 views
5

muszę mieć dwa dokumenty XML:XPath - Zapytania dwa dokumenty XML

XML1:

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

XML2:

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

Próbuję wykonać następujące czynności:

Uzyskaj wartość XML2/Author/AuthorName, gdzie XML1/Book/@ id jest równy XML2/Author/BookId.

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

Dobre pytanie (+1). Zobacz moją odpowiedź na kompletne rozwiązanie XPath 1.o i XPath 2.x. –

Odpowiedz

4

Wyrażenie XPath 1.0 nie może odnosić się do więcej niż jednego dokumentu XML, chyba że odniesienia do dodatkowych dokumentów zostały skonfigurowane w kontekście silnika XPath według języka hostingu. Na przykład, jeśli XSLT jest językiem hostingu, udostępnia swoją funkcję document() dla silnika XPath, który jest hostem.

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

Należy pamiętać, że nawet główny dokument XML musi się odwoływać za pośrednictwem innego <xsl:variable>, nazwany tutaj $mainDoc.

Funkcja document() jest dostępna tylko, jeśli Xpath jest hostowana przez XSLT! Nie jest to wspomniane w odpowiedzi Doca Browna i wprowadza w błąd czytelników.

Wyrażenie XPath 2.x może odnosić się do dowolnego dodatkowego dokumentu XML przy użyciu funkcji XPath 2.0 doc().

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

Używam livecycle. Oba pliki xml znajdują się w pamięci i próbuję zwrócić tylko jeden zestaw wyników xml. Transformacja XSLT działa tylko na jednym pliku naraz (z mojego zrozumienia). – Arnej65

+0

@ Arnej65: Transformacja XSLT może działać z * wieloma * dokumentami XML - za pomocą funkcji 'document()', drzewa tymczasowego lub dokumentów przekazanych jako parametry transformacji. –

+0

Proces xslt w livecycle może być zastosowany tylko do jednego dokumentu na raz. Połączyłem wyniki, a następnie odfiltrowałem ostateczne wyniki za pomocą XSLT. Dziękuję za rozwiązanie. – Arnej65

0

Funkcja document jest twoim przyjacielem, here to krótki poradnik jak do łączenia wielu plików wejściowych.

EDYCJA: Oczywiście, że działa tylko wtedy, gdy używasz Xpath w skrypcie Xslt.

+0

Czy zdajesz sobie sprawę, że funkcja 'document()' jest dostępna tylko w XSLT? Pierwotne pytanie dotyczy obszaru XPath, a XSLT nie jest oczekiwany. Proszę, popraw swoją odpowiedź. W rzeczywistości nie zapewnia rozwiązania. –

+0

Na koniec chciałbym wziąć "authorname" od XML2 i przypisać wartość do "authorname" w XML1. Pracuję w Livecycle i mogę użyć xslt do zrobienia transfor, ale mają one działania związane z przepływem pracy, kiedy możesz przypisać wartość za pomocą xpath. – Arnej65

+0

@ Arnej65: Nie można "przypisać wartości do" nazwa autora "w XML1" z XSLT. Transformacja XSLT nie może zmienić dokumentu XML, który transformuje - może on utworzyć tylko nowy dokument XML jako wynik. –