在不同的行中返回不同的结果

时间:2018-08-28 09:30:55

标签: xquery flwor

我发现了类似的问题,但我尝试了一下,但没有解决。 我得到了“ ventas”集合,并且在集合中有四个不同的xml文件。

这些是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>
<product categoria="C" pvp="20">
    <codigo>C2020</codigo>
    <nombre>Sopa</nombre>
    <stock>100</stock>
</product>
<product categoria="A" pvp="100">
    <codigo>A1001</codigo>
    <nombre>Tela</nombre>
    <stock>100</stock>
</product>
</productos>

clientes.xml

<clientes>
<clien numero="01">
    <nombre>Juan</nombre>
    <poblacion>Madrid</poblacion>
    <tlf>111111111</tlf>
    <direccion>Alcala</direccion>
</clien>

<clien numero="02">
    <nombre>Luis</nombre>
    <poblacion>Barcelona</poblacion>
    <tlf>2222222222</tlf>
    <direccion>Canalets</direccion>
</clien>

<clien numero="03">
    <nombre>Sara</nombre>
    <poblacion>Madrid</poblacion>
    <tlf>01012101212</tlf>
    <direccion>Sol</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>
<factura numero="103">
    <fecha>01/01/01</fecha>
    <importe>80</importe>
    <numcliente>02</numcliente>
</factura>
<factura numero="104">
    <fecha>01/01/01</fecha>
    <importe>75</importe>
    <numcliente>01</numcliente>
</factura>
</facturas>

detallefacturas.xml

<detallefacturas>
<factura numero="100">
    <codigo>Z</codigo>
    <producto descuento="0">
        <codigo>A2015</codigo>
        <unidades>2</unidades>
        <importe>0</importe>
    </producto>
    <producto descuento="0">
        <codigo>A2005</codigo>
        <unidades>1</unidades>
        <importe>0</importe>
    </producto>
</factura>
<factura numero="101">
    <codigo>X</codigo>
    <producto descuento="0">
        <codigo>B1501</codigo>
        <unidades>5</unidades>
        <importe>0</importe>
    </producto>
    <producto descuento="0">
        <codigo>A2015</codigo>
        <unidades>4</unidades>
        <importe>0</importe>
    </producto>
</factura>
<factura numero="102">
    <codigo>Y</codigo>
    <producto descuento="0">
        <codigo>C2020</codigo>
        <unidades>15</unidades>
        <importe>0</importe>
    </producto>
    <producto descuento="0">
        <codigo>A2015</codigo>
        <unidades>2</unidades>
        <importe>0</importe>
    </producto>
</factura>
<factura numero="103">
    <codigo>Q</codigo>
    <producto descuento="0">
        <codigo>C2020</codigo>
        <unidades>2</unidades>
        <importe>0</importe>
    </producto>
    <producto descuento="0">
        <codigo>A2015</codigo>
        <unidades>2</unidades>
        <importe>0</importe>
    </producto>
</factura>
<factura numero="104">
    <codigo>H</codigo>
    <producto descuento="0">
        <codigo>A1001</codigo>
        <unidades>10</unidades>
        <importe>0</importe>
    </producto>
    <producto descuento="0">
        <codigo>A2015</codigo>
        <unidades>2</unidades>
        <importe>0</importe>
    </producto>
</factura>
<factura numero="105">
    <codigo>U</codigo>
    <producto descuento="0">
        <codigo>C2020</codigo>
        <unidades>2</unidades>
        <importe>0</importe>
    </producto>
</factura>
</detallefacturas>

最后结果:

<detalle>
    <codigo>A2015</codigo>
    <nombre>Cuchillas</nombre>
    <cant>2</cant>
    <pvp>20</pvp>
    <importe/>
</detalle>
<detalle>
    <codigo>A2005</codigo>
    <nombre>Cuchillas</nombre>
    <cant>1</cant>
    <pvp>20</pvp>
    <importe/>
</detalle>
<detalle>
    <codigo>A2015</codigo>
    <nombre>Laminas</nombre>
    <cant>2</cant>
    <pvp>5</pvp>
    <importe/>
</detalle>
<detalle>
    <codigo>A2005</codigo>
    <nombre>Laminas</nombre>
    <cant>1</cant>
    <pvp>5</pvp>
    <importe/>
</detalle>

在最后一次尝试中,它以不同的元素返回数据,但复制所有数据。在每个元素中,它使用每个pvp。

1 个答案:

答案 0 :(得分:1)

我认为您想更改

for $productos in collection("/ventas")/productos
let $nombre := $productos/product[codigo=$codigos/codigo]/nombre,
    $pvp := $productos/product[codigo=$codigos/codigo]/@pvp

for $producto in collection("/ventas")/productos/product[codigo=$codigos/codigo]
let $nombre := $producto/nombre,
    $pvp := $producto/@pvp

关于评论中提出的其他问题,您还没有显示您的输入结构,我想您正在尝试用一个问题解决各种问题。您现在是否拥有正确数量的detalle元素以及正确的nombre子数据和正确的pvp值?

为了使codigo正确,我认为您最好使用

for $p1 in collection("/ventas")/productos/product,
    $p2 in collection("/ventas")/detallefacturas/factura[@numero="100"]/producto where $p1/codigo = $p2/codigo
let $nombre := $producto/nombre,
    $pvp := $producto/@pvp
return 
<detalle>
        <codigo>{data($p2/codigo)}</codigo>
        <nombre>{data($nombre)}</nombre>
        <cant>{data($p2/unidades)}</cant>
        <pvp>{data($pvp)}</pvp>
        <importe></importe>
</detalle>

使用示例数据编辑您的问题或使用有关该问题的示例数据来询问新问题。