Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多个节点检索数据时避免Xquery中的xml排列_Xml_Xquery_Basex_Flwor - Fatal编程技术网

使用多个节点检索数据时避免Xquery中的xml排列

使用多个节点检索数据时避免Xquery中的xml排列,xml,xquery,basex,flwor,Xml,Xquery,Basex,Flwor,我想知道是否有人能帮我。我的问题是,我目前正在使用BaseX,它有一个XQuery编辑器。我遇到的问题是,我有一大组XML,我想减少它们。然而,有些信息在不同的节点上,当我试图检索它们时,它们会被置换 我用来检索数据的代码是: declare namespace tfd="http://www.sat.gob.mx/TimbreFiscalDigital"; declare namespace cfdi= "http://www.sat.gob.mx/cfd/3"; de

我想知道是否有人能帮我。我的问题是,我目前正在使用BaseX,它有一个XQuery编辑器。我遇到的问题是,我有一大组XML,我想减少它们。然而,有些信息在不同的节点上,当我试图检索它们时,它们会被置换

我用来检索数据的代码是:

    declare namespace tfd="http://www.sat.gob.mx/TimbreFiscalDigital";
    declare namespace cfdi= "http://www.sat.gob.mx/cfd/3";
    declare context item := document {  <?xml version="1.0" encoding="utf-8"?>
    <cfdi:Comprobante xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"        xmlns:cfdi="http://www.sat.gob.mx/cfd/3"     xsi:schemaLocation="http://www.sat.gob.mx/cfd/3   http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd  http://www.sat.gob.mx/implocal  http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd "   xmlns:implocal="http://www.sat.gob.mx/implocal" version="3.2" serie="PUELNR"   folio="3103" fecha="2014-08-12T19:48:57"  formaDePago="PAGO EN UNA SOLA   EXHIBICION" noCertificado="00001000000301760734" subTotal="221.55"  descuento="0.00" TipoCambio="1.00" Moneda="MXN" total="257.00"  tipoDeComprobante="ingreso" metodoDePago="NO IDENTIFICADO"  LugarExpedicion="MÉXICO, PUEBLA">
     <cfdi:Emisor rfc="DBM131209N41" nombre="DEUTSCHE BANK MÉXICO, SA, INST DE    BANCA MÚLTIPLE, DIVISIÓN FIDUCIARIA F/1765">
     <cfdi:DomicilioFiscal calle="RICARDO MARGAIN ZOZAYA" noExterior="605"  colonia="SANTA ENGRACIA" municipio="SAN PEDRO GARZA GARCIA" estado="NUEVO LEÓN"  pais="MÉXICO" codigoPostal="66267" />
     <cfdi:ExpedidoEn calle="CIRCUITO JUAN PABLO II" noExterior="1936" colonia="EX. HACIENDA LA NORIA" municipio="PUEBLA" estado="PUEBLA" pais="MÉXICO"  codigoPostal="72410" />
     <cfdi:RegimenFiscal Regimen="General de Ley P. M." />
  </cfdi:Emisor>
    <cfdi:Receptor rfc="MER551201D48" nombre="MERCK SA DE CV">
    <cfdi:Domicilio calle="CALLE 5" noExterior="7" colonia="FRACC.IND.ALCE BLANCO" municipio="NAUCALPAN" estado="ESTADO DE MÉXICO" pais="MÉXICO" codigoPostal="53370" />
    </cfdi:Receptor>
     <cfdi:Conceptos>
     <cfdi:Concepto cantidad="1.00" unidad="SERVICIO" noIdentificacion="0002" descripcion="CONSUMO" valorUnitario="221.55" importe="221.55" />
     </cfdi:Conceptos>
     <cfdi:Impuestos totalImpuestosTrasladados="35.45">
     <cfdi:Traslados>
      <cfdi:Traslado impuesto="IVA" tasa="16.00" importe="35.45" />
     </cfdi:Traslados>
    </cfdi:Impuestos>
    <cfdi:Complemento>
    <implocal:ImpuestosLocales version="1.0" TotaldeRetenciones="0" TotaldeTraslados="0" />
  <tfd:TimbreFiscalDigital version="1.0" UUID="c286f974-9779-4a7f-82aa-1bd2a3764bfc" FechaTimbrado="2014-08-12T20:52:48" selloCFD="dQctOu630HzV6ZOJ7LhEXoGUDl7SHc/9PTzWGc9InJLzrj3eZ30Pk5e0P2j+UHjPcDMxxrgHd9m1nyGY54hAu8hBg9LXU8ErvmuBOF6XnIMvcHGtvKqoW9PEUCtAB8NtuvFKiZ5ARWb7K4y261qN8SiEoJxZm/d856jLqagSGHo=" noCertificadoSAT="00001000000300171326" selloSAT="PXBVJ7lpB9QEqtkKEmsBKcD77P2GwXNlidxGg3/R6OTRCm7/T0Rc8QPeUSBgCVSjHKN/VRKDAtBtE9pSHY0fSUTe3z7QfmuVmE3GV52T/K0fmFAUmfG0jYQTj9gOX4Z3lb2Mx+QRV+JvQO2sSnq16qco3cdSo2+tqeHFdawkR0k=" xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/TimbreFiscalDigital/TimbreFiscalDigital.xsd" /></cfdi:Complemento>
  <cfdi:Addenda xmlns:ecfd="http://www.southconsulting.com/schemas/strict" xsi:schemaLocation="http://www.southconsulting.com/schemas/strict http://www.southconsulting.com/schemas/strict/ecfd.xsd">
  </cfdi:Addenda>
</cfdi:Comprobante>}
    declare context item := document {

     <?xml version="1.0" encoding="UTF-8"?>

<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:detallista="http://www.sat.gob.mx/detallista" xmlns:psgecfd="http://www.sat.gob.mx/psgecfd" xmlns:ecc="http://www.sat.gob.mx/ecc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2" folio="131556" fecha="2014-07-01T08:13:34" noCertificado="00001000000301092647" formaDePago="Pago en una sola exhibicion" subTotal="156.8966" descuento="0.00" Moneda="NAL" total="182.00" tipoDeComprobante="ingreso" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd http://www.posadas.com/MFE http://www.posadas.com/MFE/ADDENDAPOSADASVL1.xsd" xmlns:posadas="http://www.posadas.com/MFE"  metodoDePago="TARJETA DE CREDITO" NumCtaPago="1093" LugarExpedicion="AVENIDA COSTERA MIGUEL ALEMAN ACAPULCO DE JUAREZ GUERRERO MEXICO">

    <cfdi:Emisor rfc="ASO0408178B2" nombre="HOTELES Y VILLAS POSADAS, S.A. DE C.V.">

        <cfdi:DomicilioFiscal calle="AVENIDA PASEO DE LA REFORMA" noExterior="155" noInterior="PISO 4" colonia="LOMAS DE CHAPULTEPEC I SECCION" municipio="MIGUEL HIDALGO" estado="DISTRITO FEDERAL" pais="MEXICO" codigoPostal="11000"/>

        <cfdi:ExpedidoEn calle="AVENIDA COSTERA MIGUEL ALEMAN" noExterior="97" colonia="FRACCIONAMIENTO CLUB DEPORTIVO" municipio="ACAPULCO DE JUAREZ" pais="MEXICO" codigoPostal="39690" estado="GUERRERO"/>

        <cfdi:RegimenFiscal Regimen="NA"/>

    </cfdi:Emisor>

    <cfdi:Receptor rfc="MER551201D48" nombre="MERCK SA DE CV">

        <cfdi:Domicilio calle="CALLE 5 No. 7 FRACC. ALCE BLANCO" municipio="NAUCALPAN DE JUAREZ" estado="ESTADO DE MEXICO" pais="MX" codigoPostal="53370"/>

    </cfdi:Receptor>

    <cfdi:Conceptos>

        <cfdi:Concepto cantidad="1.00" unidad="SERVICIO" noIdentificacion="CONSUM" descripcion="CONSUMO" valorUnitario="156.8966" importe="156.8966"/>

    </cfdi:Conceptos>

    <cfdi:Impuestos totalImpuestosTrasladados="25.1034">

        <cfdi:Traslados>

            <cfdi:Traslado tasa="16.00" importe="25.1034" impuesto="IVA"/>

        </cfdi:Traslados>

    </cfdi:Impuestos>  <cfdi:Complemento>

    <tfd:TimbreFiscalDigital xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigital.xsd" FechaTimbrado="2014-07-01T08:15:15" UUID="8a4f1be7-bdcb-4b22-b144-b3e41dd92e69" version="1.0"/>

  </cfdi:Complemento>

<cfdi:Addenda>
<posadas:RequestForPayment>
<posadas:Hoteleria cajero="210" folio="539809" importeaPagar="         200.00" propina="     18.00" > 
</posadas:Hoteleria>
</posadas:RequestForPayment>
</cfdi:Addenda>
</cfdi:Comprobante>}
    for $z in //tfd:TimbreFiscalDigital,
    $x in //cfdi:Conceptos/cfdi:Concepto[(@cantidad>0 and      @importe > 0)],
    $y in c//cfdi:ExpedidoEn
    return 
      <Factura>
        <Desc>{$x/@descripcion}</Desc>
        <Cantidad>{$x/@cantidad}</Cantidad>
        <Valor>{$x/@valorUnitario}</Valor>
        <CP>{$y/@codigoPostal}</CP>
        <UUID>{$z/@UUID}</UUID>
        <Fecha>{$z/@FechaTimbrado}</Fecha>
      </Factura>
声明命名空间tfd=”http://www.sat.gob.mx/TimbreFiscalDigital";
声明命名空间cfdi=”http://www.sat.gob.mx/cfd/3";
声明上下文项:=文档{
}
声明上下文项:=文档{
}
在//tfd:gigital中花费$z,
$x in//cfdi:Conceptos/cfdi:Concepto[(@cantidad>0和@importe>0)],
以成本计算的$y//cfdi:ExpedidoEn
返回
{$x/@descripion}
{$x/@cantidad}
{$x/@valorUnitario}
{$y/@codigoPostal}
{$z/@UUID}
{$z/@FechaTimbrado}
现在我所期望的是,在我拥有的包中,它每XML返回两个集合,所以我这里有2k个集合。尽管如此,我还是收到了20万套,因为它以各种可能的方式将每$z、每$x和每$y混合在一起。我希望它尊重每个XML,如果它从一个XML获取数据,那么所有其他数据都必须来自同一个XML


我希望我说得够清楚,谢谢你的帮助

我找到了自己的答案,对于任何对如何做感兴趣的人,我将发布代码:

for $x in //cfdi:Comprobante,
    $y in $x//cfdi:Conceptos/cfdi:Concepto,
    $z in $x//cfdi:Complemento/tfd:TimbreFiscalDigital,
    $w in $x//cfdi:ExpedidoEn
return 
  <Factura>
    <Desc>{$y/@descripcion}</Desc>
    <Cantidad>{$y/@cantidad}</Cantidad>
    <Valor>{$y/@valorUnitario}</Valor>
    <Fecha>{$z/@FechaTimbrado}</Fecha>
    <Lugar>{$w/@codigoPostal}</Lugar>
    <UUID>{$z/@UUID}</UUID>       
  </Factura>
为$x in//cfdi:Comprobante,
$x中的$y//cfdi:Conceptos/cfdi:Concepto,
$x中的$z//cfdi:Complemento/tfd:digital,
$x中的$w//cfdi:ExpedidoEn
返回
{$y/@descripion}
{$y/@cantidad}
{$y/@valorUnitario}
{$z/@FechaTimbrado}
{$w/@codigoPostal}
{$z/@UUID}

因此,与其让
$w
$y
$z
都从文档的根目录进行搜索(即
//cfdi:ExpedidoEn
),他们从父目录进行搜索(
$x//cfdi:ExpedidoEn
)。

将来,确保您的代码示例符合MCVE规则——这意味着,在某种程度上,它们需要可验证——也就是说,它们需要制造你的实际问题。一些不是有效的XML但是伪代码的东西无法通过XQuery处理器由想要测试其修复是否有效的人运行。请参阅以了解更多信息。无论如何,现在,您的代码非常不清楚。在本例中,它交替使用“元素”和“属性”,但查询只查找元素,而不查找属性。例如,一种可能的修复方法是,相对于$x在不同轴上的位置对$y和$z进行查询,但这就假设了数据的布局,即问题的内容不足以确认或否认。如果唯一可用的选项是同时对三个集合进行索引,而不是进行交叉积(x[1],y[1],z[1];x[2],y[2],z[2];等等),那么这也是可能的,但是,如果您的数据包含的内容与您期望的结构不符,则更容易出错,因此我们希望了解更多有关数据结构的信息,以了解它是否是唯一的选项。我将附上原始xml和我使用的代码,谢谢!所以--我不得不稍微改变一下,将XML作为上下文项传递,并删除外部文档内容,但它不会产生经过修改的结果,显然是因为给定的文档中没有
cfdi:ExpeditoEn
。是的,这是一个非常好的答案。如果唯一更改的代码是查询本身,则可能会对其进行精简。它在XML中没有做任何更改。