我想删除 XML 数据类型列中的所有节点;匹配所有记录的属性条件。例如<resource>
具有属性“type”的节点,其值类似于“%audio%”。
输入:
<metadata Item="1234" version="5" packageVersion="5" xmlns="http://www.imsglobal.org/xsd/imsqti_v2p2">
<contents>
<content version="0" href="content_es-mx_en-us.xml" lang="es-mx" altlang="en-us">
<resources />
</content>
<content version="3" href="content_en-us.xml" lang="en-us">
<resources>
<resource type="image/svg" href="girlwateringtomatoes2.svg" />
<resource type="audio/ogg" href="Audio/115988A_Sound1.ogg" />
<resource type="audio/mp4" href="Audio/115988A_Sound1.m4a" />
</resources>
</content>
</contents>
<references />
<brailleEncodings />
</metadata>
输出:
<metadata Item="1234" version="5" packageVersion="5" xmlns="http://www.imsglobal.org/xsd/imsqti_v2p2">
<contents>
<content version="0" href="content_es-mx_en-us.xml" lang="es-mx" altlang="en-us">
<resources />
</content>
<content version="3" href="content_en-us.xml" lang="en-us">
<resources>
<resource type="image/svg" href="girlwateringtomatoes2.svg" />
</resources>
</content>
</contents>
<references />
<brailleEncodings />
</metadata>
这是我试过但没有用的查询。
;WITH XMLNAMESPACES ('http://www.imsglobal.org/xsd/imsqti_v2p2' AS NS)
Update dbo.TableX
SET [XML].modify('delete /NS:metadata/NS:contents/NS:content[2]/resources/resource[@type != "image/svg"]')
谢谢!
最佳答案
如果您想删除所有具有type
的内容,例如audio
,您可以使用contains
:
;WITH XMLNAMESPACES ('http://www.imsglobal.org/xsd/imsqti_v2p2' AS NS)
Update TableX
SET [XML].modify('delete /NS:metadata/NS:contents/NS:content[2]/NS:resources/NS:resource[contains(@type, "audio")]');
输出:
<metadata xmlns="http://www.imsglobal.org/xsd/imsqti_v2p2" Item="1234" version="5" packageVersion="5">
<contents>
<content version="0" href="content_es-mx_en-us.xml" lang="es-mx" altlang="en-us">
<resources />
</content>
<content version="3" href="content_en-us.xml" lang="en-us">
<resources>
<resource type="image/svg" href="girlwateringtomatoes2.svg" />
</resources>
</content>
</contents>
<references />
<brailleEncodings />
</metadata>
或者在 XML 文档中的任何位置:
;WITH XMLNAMESPACES (DEFAULT 'http://www.imsglobal.org/xsd/imsqti_v2p2' )
Update TableX
SET [XML].modify('delete //resources/resource[contains(@type, "audio")]');
关于sql-server - 删除 XML 节点以匹配 SQLServer 中的属性条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35897068/