XQuery wiele plików XML?


Czy można otworzyć 2 dokumenty z xQuery i połączyć je?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Tak, tutaj

przykład
http://www.w3.org/TR/xquery/%2 ... tions
z

Specyfikacje
http://www.w3.org/TR/xquery
XQuery .:

„Łączenia, które łączą dane z wielu źródeł w jeden wynik, są bardzo ważnym typem zapytań. W tej sekcji zilustrujemy, jak wiele typów sprzężeń można wyrazić w XQuery. Nasze przykłady opieramy na następujących trzech dokumentach :
  • Dokument o nazwie
    Parts.xml
    zawierający wiele
    Część> Część
    ; Każdy
    Część
    Element, z kolei zawiera podetrzy elementy
    Partno
    i
    Opis
    .
  • Dokument o nazwie dostawcy.xml Zawierający zestaw
    Dostawca
    ; Każdy
    Dostawca
    Element, z kolei zawiera
    DUMPNO
    i
    <code <code="">. 
    [/code]
  • Dokument o nazwie
    catalog.xml
    zawierający informacje o relacjach między dostawcami a częściami. Dokument katalogu zawiera wiele elementów
    item
    , z których każdy z kolei zawiera podelementy
    partno
    ,
    supno
    i
    price
    ...

Łączenie normalne („wewnętrzne”) zwraca informacje z co najmniej dwóch powiązanych źródeł, jak pokazano w poniższym przykładzie, który łączy informacje z trzech dokumentów. Ten przykład tworzy „katalog opisowy”, który pochodzi z dokumentu katalogu, ale zawiera opisy części zamiast numerów części i nazw dostawców zamiast numerów dostawców. Nowy katalog jest posortowany alfabetycznie według opisu części, a po drugie według nazwy dostawcy. *
<descriptive-catalog>
{
for $i in fn:doc("catalog.xml")/items/item,
$p in fn:doc("parts.xml")/parts/part[partno = $i/partno],
$s in fn:doc("suppliers.xml")/suppliers
/supplier[suppno = $i/suppno]
order by $p/description, $s/suppname
return
<item>
{
$p/description,
$s/suppname,
$i/price
}
</item>
}
</descriptive-catalog>

Poprzednie zapytanie zwraca tylko informacje o częściach u dostawców i dostawcach z częściami. Zewnętrzny

złożony

- Jest to połączenie zapisujące informacje z jednego lub więcej źródeł uczestniczących, w tym elementów, które nie mają odpowiedniego elementu w innym źródle. Na przykład,

lewe połączenie zewnętrzne

Między dostawcami i przedmiotami mogą zwrócić informacje o dostawcach, którzy nie mają odpowiednich szczegółów. "

Należy pamiętać, że XQuery nie ma standardowej funkcji

Dokument ()
funkcjonować
http://www.w3.org/TR/xslt20/#function-document

Xslt) i zamiast tego ma


Funkcja DOC (), która jest częścią "

Funkcje i operatorzy.
http://www.w3.org/TR/xpath-functions
XQuery 1.0 i XPath 2.0 ”.

Odpowiedź Chrisa zawiera co najmniej dwa błędy

:
  • XQuery Wrażliwy K. Zarejestrować http://www.w3.org/TR/xquery/#lexical-structure-Prawne słowa kluczowe stosowane w przykładzie Chris nie będą dozwolone przez odpowiedni procesor XQuery.
  • Nie ma potrzeby prefiksu standardowych funkcji, takich jak DOC (), po prostu zacytuj specyfikację XQuery, która ma prefiks ... W przeciwnym razie we własnym kodzie pomijałbym prefiks „
    fn
    ”.
  • Funkcja document () nie jest funkcją standardową XQuery/XPath. Powinien zamiast tego posługiwać się http://www.w3.org/TR/xpath-functions/#func-docFunkcja doc ().
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

to łatwiejsze niż to (przynajmniej używając SAXON):
<pre class="lang-saxon prettyprint-override">
let $items := ( doc("file1.xml") ,
doc("file2.xml") ,
doc("file3.xml"))for $x in $items ...
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W XQuery, jeśli piszesz coś takiego jak:
<pre class="lang-xquery prettyprint-override">
for $x in doc('doc1.xml')//a
for $y in doc('doc2.xml')//a
where $x/@name = $y/@name
return $x

Następnie procesor XQuery powinien wystarczyć, aby określić, jakie jest połączenie.
Nigdy nie wskazujesz wyraźnie do XQuery, że coś jest podłączone. Ogólny temat w XQuery jest taki, że twój program mówi,

co

informacje, które chcesz dostać, a nie

tak jak

obliczyć to.
Chociaż może się wydawać, że wielokrotnie przeglądasz drugi dokument, w praktyce prawdziwy procesor XQuery zrobi to bardziej inteligentnie, mniej więcej podobnie do poniższej instrukcji SQL (mój SQL jest bardzo zardzewiały, więc przepraszam jeśli ta składnia jest całkowicie błędna )
<pre class="lang-sql prettyprint-override">
SELECT doc1.a
FROM doc1 INNER JOIN doc2
WHERE doc1.name = doc2.name

Test porównawczy XMark zawiera kilka przykładowych zapytań, na które należy zwrócić uwagę. W szczególności żądania od 9 do 12 tworzą połączenia.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się