Возвращать разные результаты в разных строках
Я нашел похожие вопросы, но я попробовал их, и я не получил его на работу. У меня есть коллекция "Вентас", и внутри коллекции у меня есть четвёртые файлы 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 ответ
Я думаю, что вы хотите изменить
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>
Это может помочь отредактировать ваш вопрос с образцами данных или задать новый вопрос с образцами данных по этой проблеме.