gpt4 book ai didi

sql - 使用命名空间修改 xml

转载 作者:数据小太阳 更新时间:2023-10-29 01:39:33 26 4
gpt4 key购买 nike

我正在尝试在 TSQL 中修改预定义的 xml(更具体地说是 xsd)。我想向其中一个 xsd 元素插入枚举限制。

任务是根据查询填充xsd限制示例:

create table #list(value nvarchar(100))
insert into #list values('item 1')
insert into #list values('item 2')
insert into #list values('item 3')
insert into #list values('item 4')
insert into #list values('item 5')
insert into #list values('item 6')

declare @enumeration as xml
;with xmlnamespaces('http://www.w3.org/2001/XMLSchema' as xs)
select @enumeration = (
select value as '@value'
from #list for xml path('xs:enumeration')
)

declare @schema xml
set @schema =
'<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="test">
<xs:element name="test" msdata:IsDataSet="true" msdata:MainDataTable="Example" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Example">
<xs:complexType>
<xs:sequence>
<xs:element name="myList" minOccurs="1" nillable="false">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>'

set @schema.modify
('insert sql:variable("@enumeration")
into (//xs:element[@name=''myList'']/xs:simpleType/xs:restriction)[1]')

select @schema

问题是代码输出了不必要的xmlns属性

<xs:enumeration xmlns:xs="http://www.w3.org/2001/XMLSchema" value="item 1" />

有人能帮忙吗?

最佳答案

它比我希望的更难看。主要是因为我不能在 .modify() 中使用 sql:variable("@enumeration")/delete-me/node()

我假设,您可以修改 @enumeration 的生成,如下所示:

CREATE TABLE #list (value nvarchar(100));
INSERT INTO #list
VALUES ('item 1');
INSERT INTO #list
VALUES ('item 2');
INSERT INTO #list
VALUES ('item 3');
INSERT INTO #list
VALUES ('item 4');
INSERT INTO #list
VALUES ('item 5');
INSERT INTO #list
VALUES ('item 6');

DECLARE @enumeration AS xml;
WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema' AS xs)
SELECT @enumeration = (
SELECT value AS '@value'
FROM #list FOR XML PATH('xs:enumeration'), ROOT('delete-me'), TYPE
);

思路是将FOR XMLROOT一起使用,这样生成的命名空间就在不需要的根元素处(可以跳过)。否则我们稍后将不得不重新创建 xs:enumeration 元素。

两种解决方案

使用.modify()三次

想法:

  1. 我们将 @enumeration 中的所有内容(带有不必要的根)插入到另一个 xml 中
  2. 我们将需要的内容复制到合适的地方
  3. 我们删除了 @schema 中不再需要的 @enumeration 副本。
DECLARE @schema xml;
SET @schema = '<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="test">
<xs:element name="test" msdata:IsDataSet="true" msdata:MainDataTable="Example" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Example">
<xs:complexType>
<xs:sequence>
<xs:element name="myList" minOccurs="1" nillable="false">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>';

SET @schema.modify('insert sql:variable("@enumeration")
into /');

SET @schema.modify('declare namespace xs="http://www.w3.org/2001/XMLSchema";
insert /delete-me/node()
into (//xs:element[@name=''myList'']/xs:simpleType/xs:restriction)[1]');

SET @schema.modify('delete /delete-me');

SELECT @schema;

DROP TABLE #list;

.query() 创建@schema

如果你可以改变创建@schema的部分,你可以直接从生成@schema作为.query() >@枚举:

DECLARE @enumeration AS xml;
WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema' AS xs)
SELECT @enumeration = (
SELECT value AS '@value'
FROM #list FOR XML PATH('xs:enumeration'), ROOT('delete-me'), TYPE
);

DECLARE @schema xml;
SET @schema = @enumeration.query('<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="test">
<xs:element name="test" msdata:IsDataSet="true" msdata:MainDataTable="Example" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Example">
<xs:complexType>
<xs:sequence>
<xs:element name="myList" minOccurs="1" nillable="false">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50" />
{/delete-me/node()}
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>');

SELECT @schema;

关于sql - 使用命名空间修改 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12973696/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com