将 xml 命名空间限制为仅限主根

问题描述 投票:0回答:2

我有这个疑问

 WITH XMLNAMESPACES(DEFAULT 'https://tribunet.hacienda.go.cr /docs/esquemas/2017/v4.2/facturaElectronica'
                      ,'http://www.w3.org/2001/XMLSchema' AS xsd
                      ,'http://www.w3.org/2001/XMLSchema-instance' AS xsi)
SELECT 1 AS [id]
        ,0 AS [pass]
        (
         /*Others*/
        SELECT 
        OT.OTH_MESSAGE as Others
        FROM [crdx_COREDev1].[dbo].[OTH_OTHERS] as OT
        where 
        OT.OTH_ID=E.OTH_ID
        fOR XML PATH ('Others'), type

       )
      ,0 AS [CONSECUTIVE]

      FOR XML PATH('FE');

这会生成此 XML

<FE xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2    /facturaElectronica"> <- CHANGE 2
 <id>1</id>
 <pass>0</pass>
 <CONSECUTIVE>0</CONSECUTIVE>
 <Others xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2 /facturaElectronica">
 <MESSAGE>MESSAGE</MESSAGE>       
</Others> 
 </FE>

现在我的问题:我只想用

<FE>
显示命名空间,但是 - 正如您在 xml 中看到的 - 声明也出现在
<Others>
中。我怎样才能将其限制为
<FE>

sql-server xml t-sql xml-namespaces
2个回答
2
投票

这是一个恼人且众所周知的问题,每当您在

FOR XML
查询中使用与嵌套子查询相关的命名空间时,就会发生...

连接问题已存在 10 多年 - 直到最近消失。

值得一提的是,这些重复的命名空间声明并没有错,只是让你的 XML 变得臃肿。它可能与严格的模式验证发生冲突。

没有好的解决方案,只有解决方法:

  • 创建不带命名空间的内部 XML 并在字符串基础上添加包装节点,或者
  • 将命名空间创建为普通属性(但不命名为
    xmlns
    )并使用
    REPLACE
    更改名称。

两种解决方法都需要转换为

NVARCHAR(MAX)
再转换回
XML

我真的不知道,为什么要这样实现......

查找一些相关示例

注意

xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2    /facturaElectronica">

您正在使用带空格的命名空间 URL。这是不允许的...


0
投票

您可以尽可能避免使用子查询,并使用

/
语法来代替嵌套。请参阅此答案

© www.soinside.com 2019 - 2024. All rights reserved.