3

Я хочу, чтобы установить инструкцию по обработке, чтобы включить таблицы стилей на вершине XML:SQL Server FOR XML PATH: Набор XML-декларации или инструкции по обработке «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> 

Мои исследования привели меня к узловой тест синтаксиса и processing-instruction().

Этот

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); 

Есть ли шанс решить эту проблему?

ответ

2

Существует еще один способ, который потребуется два шага, но не нужно, чтобы обработать 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

Выражение XQuery переданная в modify(), функция сообщает 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

+0

Отличный вход, спасибо! Пока они не найдут что-то вроде 'top-processing-instruction()', это очень хорошая работа! – Shnugo

+0

Привет, Har07, мне просто пришлось иметь дело с добавлением объявления xml и мысли, это можно было бы сделать аналогичным образом, но это не так. Я добавил ответ с (довольно очевидным) решением ... – Shnugo

0

Как выяснилось, большой ответ har07 не работает с XML-декларации. Единственный способ, которым я мог бы найти было это:

DECLARE @ExistingXML XML= 
(
    SELECT 
     'Test' AS Test, 
     'SomeMore' AS SomeMore 
    FOR XML PATH('TestPath'),TYPE 
); 

DECLARE @XmlWithDeclaration NVARCHAR(MAX)= 
(
    SELECT '<?xml version="1.0" encoding="UTF-8"?>' 
      + 
      CAST(@ExistingXml AS NVARCHAR(MAX)) 
); 
SELECT @XmlWithDeclaration; 

Вы должны оставаться в string линии после этого шага, любое преобразование в реального XML либо выдаст ошибку (если кодирование другой тогда UTF-16) или будет оммите эту xml-декларацию.