Возвращать значения из разных XML-файлов в выражении FLWOR - PullRequest
0 голосов
/ 27 августа 2018

Я хочу вернуть разные значения из разных коллекций в одном выражении FLWOR.

XML-файлы:

productos.xml

<productos>
<product categoria="A" pvp="20">
    <codigo>A2015</codigo>
    <nombre>Cuchillas</nombre>
    <stock>100</stock>
</product>
<product categoria="A" pvp="5">
    <codigo>A2005</codigo>
    <nombre>Laminas</nombre>
    <stock>57</stock>
</product>
<product categoria="B" pvp="15">
    <codigo>B1501</codigo>
    <nombre>Comida</nombre>
    <stock>50</stock>
</product>
</productos>

clientes.xml

<clientes>
<clien numero="01">
    <nombre>Luu</nombre>
    <poblacion>Madrid</poblacion>
    <tlf>111111111</tlf>
    <direccion>Alcala</direccion>
</clien>
<clien numero="02">
    <nombre>Joan</nombre>
    <poblacion>Barcelona</poblacion>
    <tlf>2222222222</tlf>
    <direccion>Canalets</direccion>
</clien>
</clientes>

facturas.xml

<facturas>
<factura numero="100">
    <fecha>01/01/01</fecha>
    <importe>25</importe>
    <numcliente>01</numcliente>
</factura>
<factura numero="101">
    <fecha>01/01/01</fecha>
    <importe>40</importe>
    <numcliente>01</numcliente>
</factura>
<factura numero="102">
    <fecha>01/01/01</fecha>
    <importe>4</importe>
    <numcliente>02</numcliente>
</factura>
</facturas>

detallefacturas.xml

<detallefacturas>
<factura numero="100">
    <codigo>Z</codigo>
    <producto descuento="0">
        <codigo>A2015</codigo>
        <unidades>2</unidades>
    </producto>
    <producto descuento="0">
        <codigo>A2005</codigo>
        <unidades>1</unidades>
    </producto>
</factura>
<factura numero="101">
    <codigo>X</codigo>
    <producto descuento="0">
        <codigo>B1501</codigo>
        <unidades>5</unidades>
    </producto>
</factura>
<factura numero="102">
    <codigo>Y</codigo>
    <producto descuento="0">
        <codigo>C2020</codigo>
        <unidades>15</unidades>
    </producto>
    <producto descuento="0">
        <codigo>A2015</codigo>
        <unidades>2</unidades>
    </producto>
</factura>
</detallefacturas>

Мне нужно вернуть сведения о «фактурах», которые содержат продукты с «категорией = А»

Это может быть результатом:

Num factura 100, клиент Luu, категория продуктов A: 2

Я пытаюсь сделать что-то похожее на JOIN в SQL, но не могу получить нужные значения.

EDIT:

Это то, что я получил сейчас, но это не работает.

for $x in collection("/ventas")
let $NUMFACTURA := $x/facturas/factura
let $NOM := $x/clientes/clien[@numero=$NUMFACTURA/numcliente]
let $PRODFACTURA := $x/detallefacturas/factura[@numero=$NUMFACTURA/@numero]
let $CODPRODATA := $x/productos/product[@categoria="A"]/codigo
return $NUMFACTURA/@numero/string()

1 Ответ

0 голосов
/ 28 августа 2018

С XQuery 3.1

let $productosA := $documento-productos/productos/product[@categoria = $categoria]
for $factura in facturas/factura
let $factura-detalle := $documento-detalles-de-facturas/detallefacturas/factura[@numero = $factura/@numero],
    $cliente := $documento-clientes/clientes/clien[@numero = $factura/numcliente],
    $factura-productosA := $factura-detalle/producto[codigo = $productosA/codigo]
where (not(empty($factura-productosA)))
return 
    ``[Num factura `{$factura/@numero}`, cliente `{$cliente/nombre}`, Products categoria A: `{count($factura-productosA)}`]``

для ваших образцов данных я получаю результат

Num factura 100, cliente Luu, Products categoria A: 2
Num factura 102, cliente Joan, Products categoria A: 1

Полный запрос с первичным входным документом фактур и, например, других документов, настроенных как встроенные переменные, которые можно, конечно, заменить вызовами doc или collection, выглядит следующим образом:

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

declare option output:method 'text';
declare option output:item-separator '&#10;';

declare variable $categoria as xs:string := 'A';

declare variable $documento-productos as document-node(element(productos)) := document {
    <productos>
    <product categoria="A" pvp="20">
        <codigo>A2015</codigo>
        <nombre>Cuchillas</nombre>
        <stock>100</stock>
    </product>
    <product categoria="A" pvp="5">
        <codigo>A2005</codigo>
        <nombre>Laminas</nombre>
        <stock>57</stock>
    </product>
    <product categoria="B" pvp="15">
        <codigo>B1501</codigo>
        <nombre>Comida</nombre>
        <stock>50</stock>
    </product>
    </productos>
};

declare variable $documento-clientes as document-node(element(clientes)) := document {
    <clientes>
    <clien numero="01">
        <nombre>Luu</nombre>
        <poblacion>Madrid</poblacion>
        <tlf>111111111</tlf>
        <direccion>Alcala</direccion>
    </clien>
    <clien numero="02">
        <nombre>Joan</nombre>
        <poblacion>Barcelona</poblacion>
        <tlf>2222222222</tlf>
        <direccion>Canalets</direccion>
    </clien>
    </clientes>
};

declare variable $documento-detalles-de-facturas as document-node(element(detallefacturas)) := document {
    <detallefacturas>
    <factura numero="100">
        <codigo>Z</codigo>
        <producto descuento="0">
            <codigo>A2015</codigo>
            <unidades>2</unidades>
        </producto>
        <producto descuento="0">
            <codigo>A2005</codigo>
            <unidades>1</unidades>
        </producto>
    </factura>
    <factura numero="101">
        <codigo>X</codigo>
        <producto descuento="0">
            <codigo>B1501</codigo>
            <unidades>5</unidades>
        </producto>
    </factura>
    <factura numero="102">
        <codigo>Y</codigo>
        <producto descuento="0">
            <codigo>C2020</codigo>
            <unidades>15</unidades>
        </producto>
        <producto descuento="0">
            <codigo>A2015</codigo>
            <unidades>2</unidades>
        </producto>
    </factura>
    </detallefacturas>
};

let $productosA := $documento-productos/productos/product[@categoria = $categoria]
for $factura in facturas/factura
let $factura-detalle := $documento-detalles-de-facturas/detallefacturas/factura[@numero = $factura/@numero],
    $cliente := $documento-clientes/clientes/clien[@numero = $factura/numcliente],
    $factura-productosA := $factura-detalle/producto[codigo = $productosA/codigo]
where (not(empty($factura-productosA)))
return 
    ``[Num factura `{$factura/@numero}`, cliente `{$cliente/nombre}`, Products categoria A: `{count($factura-productosA)}`]``

Онлайн образец на https://xqueryfiddle.liberty -development.net / 6qM2e29 / 2 .

...