FLWOR 表达式中来自不同 xml 个文件的 Return 个值
Return values from different xml files in FLWOR expression
我想在一个 FLWOR 表达式中 return 来自不同集合的不同值。
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>
删除facturas.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>
我需要 return "facturas" 的详细信息,其中包含具有 "categoria=A"
的产品
这可能是一个结果:
Num factura 100,客户 Luu,产品类别 A:2
我正在尝试做一些类似于 SQL 中的 JOIN 的事情,但我无法获得我需要的值。
编辑:
这就是我现在得到的,但它不起作用。
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()
使用 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
使用 facturas 的主要输入文档的完整查询,例如,其他文档被设置为内联变量,您当然可以用 doc
或 collection
调用替换,如下:
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method 'text';
declare option output:item-separator ' ';
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。
我想在一个 FLWOR 表达式中 return 来自不同集合的不同值。
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>
删除facturas.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>
我需要 return "facturas" 的详细信息,其中包含具有 "categoria=A"
的产品这可能是一个结果:
Num factura 100,客户 Luu,产品类别 A:2
我正在尝试做一些类似于 SQL 中的 JOIN 的事情,但我无法获得我需要的值。
编辑:
这就是我现在得到的,但它不起作用。
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()
使用 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
使用 facturas 的主要输入文档的完整查询,例如,其他文档被设置为内联变量,您当然可以用 doc
或 collection
调用替换,如下:
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method 'text';
declare option output:item-separator ' ';
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。