sql-server – SQL Server FOR XML PATH:在顶部设置xml-declaration或处理指令“xml-stylesheet”

前端之家收集整理的这篇文章主要介绍了sql-server – SQL Server FOR XML PATH:在顶部设置xml-declaration或处理指令“xml-stylesheet”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想设置一个处理指令,在XML上包含一个样式表:

同样的问题是xml声明(例如<?xml version =“1.0”encoding =“utf-8”?>)

期望的结果:

<?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>
<TestPath>
  <Test>Test</Test>
  <SomeMore>SomeMore</SomeMore>
</TestPath>

我的研究带给我节点测试语法和处理指令().

这个

SELECT 'type="text/xsl" href="stylesheet.xsl"' AS [processing-instruction(xml-stylesheet)],'Test' AS Test,'SomeMore' AS SomeMore
FOR XML PATH('TestPath')

产生这个:

<TestPath>
  <?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>
  <Test>Test</Test>
  <SomeMore>SomeMore</SomeMore>
</TestPath>

我找到的所有提示告诉我将XML转换为VARCHAR,“手动”连接并将其转换回XML.但这是 – 怎么说 – 难看?

这很明显:

SELECT CAST(
'<?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>
<TestPath>
  <Test>Test</Test>
  <SomeMore>SomeMore</SomeMore>
</TestPath>' AS XML);

有机会解决这个问题吗?

解决方法

还有另一种方法,它需要两个步骤,但不需要您在过程中的任何位置将XML视为字符串:
declare @result XML =
(
    SELECT 
        'Test' AS Test,'SomeMore' AS SomeMore
    FOR XML PATH('TestPath')
)
set @result.modify('
    insert <?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>
    before /*[1]
')

Sqlfiddle Demo

传递给modify()函数的XQuery表达式告诉sql Server在XML的根元素之前插入处理指令节点.

更新:

基于以下线程找到另一种替代方案:Merge the two xml fragments into one?.我个人更喜欢这种方式:

SELECT CONVERT(XML,'<?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>'),(
    SELECT 
        'Test' AS Test,'SomeMore' AS SomeMore
    FOR XML PATH('TestPath')
)
FOR XML PATH('')

Sqlfiddle Demo

猜你在找的MsSQL相关文章