小编典典

在SQL中复制XML名称空间

sql

我有以下问题,我需要删除“ cfdi”的“ cfdi_”:

我使用了命名空间来解决这个问题,但是每个节点都重复了这些命名空间,因此无法消除它们,如果您能帮助我,我将不胜感激

declare @Mydoc xml;

set @Mydoc = (SELECT 
                  '' as importe,
                  (SELECT Importe, TasaCuota, TipoFactor, Impuesto, Base
                   FROM CDFIDet
                   FOR XML RAW('cfdi_traslado'), TYPE, ROOT('cfdi_traslados'))
              FROM
                  CFDIENC
              FOR XML RAW('cfdi_gatito'),type)

SELECT @Mydoc;

结果1:

<cfdi:gatito importe="">
  <cfdi:traslados>
    <cfdi:traslado Importe="1920" TasaCuota="0" TipoFactor="Tasa" Impuesto="16" Base="240" />
    <cfdi:traslado Importe="2202" TasaCuota="0" TipoFactor="TASA" Impuesto="16" Base="450" />
  </cfdi:traslados>
</cfdi:gatito>

第二次尝试:

declare @Mydoc xml;

WITH xmlnamespaces ('uri' as cfdi)
    SELECT @Mydoc = (SELECT 
                         '' AS importe,
                         (SELECT Importe, TasaCuota, TipoFactor, Impuesto, Base
                          FROM CDFIDet
                          FOR XML RAW('cfdi:traslado'), TYPE, ROOT('cfdi:traslados'))
                     FROM CFDIENC
                     FOR XML RAW('cfdi:gatito'), TYPE)

SELECT @Mydoc;

结果:

<cfdi:gatito xmlns:cfdi="uri" importe="">
  <cfdi:traslados xmlns:cfdi="uri">
    <cfdi:traslado Importe="1920" TasaCuota="0" TipoFactor="Tasa" Impuesto="16" Base="240" />
    <cfdi:traslado Importe="2202" TasaCuota="0" TipoFactor="TASA" Impuesto="16" Base="450" />
  </cfdi:traslados>
</cfdi:gatito>

我的代码更大,并且重复了太多次,我不知道如何消除它们


阅读 157

收藏
2021-04-14

共1个答案

小编典典

从XML来看,第二个结果是自给自足的XML元素,而第一个结果只能cfdi是定义前缀名称空间的其他元素的一部分。因此,我想所有的工作都如您所定义。

子选择

(SELECT Importe, TasaCuota, TipoFactor, Impuesto, Base
                      FROM CDFIDet
                      FOR XML RAW('cfdi:traslado'), TYPE, ROOT('cfdi:traslados'))

产生自给自足的结果

<cfdi:traslados xmlns:cfdi="uri">
   <cfdi:traslado Importe="1920" TasaCuota="0" TipoFactor="Tasa" Impuesto="16" Base="240" />
   <cfdi:traslado Importe="2202" TasaCuota="0" TipoFactor="TASA" Impuesto="16" Base="450" />
</cfdi:traslados>

因为您定义了ROOT('cfdi:traslados')-您具有名称空间,并且嵌套元素cfdi:traslado位于同一个名称空间中-
没有单独的名称空间声明。

然后顶部选择:

 SELECT 
   '' AS importe,
   (SELECT Importe, TasaCuota, TipoFactor, Impuesto, Base
      FROM CDFIDet
           FOR XML RAW('cfdi:traslado'), TYPE, ROOT('cfdi:traslados'))
 FROM CFDIENC
   FOR XML RAW('cfdi:gatito'), TYPE)

为其定义根元素,cfdi:traslados因为cfdi:gatito它具有自己的cfdi前缀名称空间声明。

我对sql-server XML不熟悉,但是如果您ROOT('cfdi:traslados')从子选择中删除会发生什么
呢?它会xmlns:cfdi="uri"<cfdi:traslados xmlns:cfdi="uri">元素中删除吗?

2021-04-14