2016-06-15 3 views
2

Причина, по которой я пишу, состоит в том, что у меня есть база данных размером около 1k xmls в BaseX. Я уже убрал его и получил информацию, которую хотел. Тем не менее, я хочу иметь возможность экспортировать эти данные в формате CSV. Когда я попытался с кодом, указанным в документации Basex он дал мне это:Преобразование xml в csv из XQuery в BaseX

Desc,Cantidad,Valor,Fecha,Lugar,UUID 
,,,,, 
,,,,, 

И он должен показать данные между запятыми. Я спрашиваю, как мне изменить код, чтобы отображались данные.

Мой код выглядит следующим образом:

declare namespace tfd="http://www.sat.gob.mx/TimbreFiscalDigital"; 
declare namespace cfdi= "http://www.sat.gob.mx/cfd/3"; 

declare option output:method "csv"; 
declare option output:csv "header=yes, separator=comma"; 

    declare context item := document { 
<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 $x in //cfdi:Comprobante, 
$y in $x//cfdi:Conceptos/cfdi:Concepto, 
$z in $x//cfdi:Complemento/tfd:TimbreFiscalDigital, 
$w in $x//cfdi:ExpedidoEn 
return 
<csv> 
    <Desc>{$y/@descripcion}</Desc> 
    <Cantidad>{$y/@cantidad}</Cantidad> 
    <Valor>{$y/@valorUnitario}</Valor> 
    <Fecha>{$z/@FechaTimbrado}</Fecha> 
    <Lugar>{$w/@codigoPostal}</Lugar> 
    <UUID>{$z/@UUID}</UUID> 
</csv> 

ответ

3

XML, CSV, необходимые для сериализации описано в документации CSV module. Пример из документации Basex:

<csv> 
    <record> 
    <Name>Huber</Name> 
    <First_Name>Sepp</First_Name> 
    <Address>Hauptstraße 13</Address> 
    <City>93547 Hintertupfing</City> 
    </record> 
</csv> 

С другими словами, элемент <csv/> оборачивает все данные, каждая запись отделена от <csv/> элементов и, наконец, столбцы хранятся в виде элементов с текстом узлом детьми.

Глядя на ваш выходной ток (удалив параметр сериализации), следующие возвращается:

<csv> 
    <Desc descripcion="CONSUMO"/> 
    <Cantidad cantidad="1.00"/> 
    <Valor valorUnitario="156.8966"/> 
    <Fecha FechaTimbrado="2014-07-01T08:15:15"/> 
    <Lugar codigoPostal="39690"/> 
    <UUID UUID="8a4f1be7-bdcb-4b22-b144-b3e41dd92e69"/> 
</csv> 

Вы не соответствуют требованиям по двум направлениям:

  • нет <record/> элементов
  • значения, хранящиеся как атрибуты, а не текстовые узлы

Если исправить обе эти проблемы с запросом, как:

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 
<csv><record> 
    <Desc>{$y/@descripcion/data()}</Desc> 
    <Cantidad>{$y/@cantidad/data()}</Cantidad> 
    <Valor>{$y/@valorUnitario/data()}</Valor> 
    <Fecha>{$z/@FechaTimbrado/data()}</Fecha> 
    <Lugar>{$w/@codigoPostal/data()}</Lugar> 
    <UUID>{$z/@UUID/data()}</UUID></record> 
</csv> 

вы получите ожидаемый результат CSV:

Desc,Cantidad,Valor,Fecha,Lugar,UUID 
CONSUMO,1.00,156.8966,2014-07-01T08:15:15,39690,8a4f1be7-bdcb-4b22-b144-b3e41dd92e69 
+0

Любой шанс, что вы знаете, как импортировать его в определенное место автоматически? –

+0

Позвольте мне объяснить себя лучше. Когда вы храните результат в BaseX, он все еще говорит о своем XML, а не о CSV. Как я могу это изменить? –

+1

Сериализация происходит только тогда, когда результат печатается. Вы применяете сериализацию к строке через 'csv: serialize ($ input as node()) как функция xs: string', описанная в той же самой ссылке выше. –

0

открыть файл в редакторе и заменить все < \ путем; < \
следующее открыть файл в BaseX и экспортировать как csv

Смежные вопросы