3

Je veux définir une instruction de traitement pour inclure une feuille de style au-dessus d'un XML:SQL Server pour XML PATH: Set-déclaration xml ou instruction de traitement "xml-stylesheet" sur

Le même problème a été la xml-déclaration (par exemple <?xml version="1.0" encoding="utf-8"?>)

résultat souhaité:

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

Ma recherche m'a amené à test de noeud syntaxe et processing-instruction().

Ce

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

produit ceci:

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

Tous les conseils que j'ai trouvé me dire de convertir le XML en VARCHAR, concaténer "manuellement" et reconvertir en XML. Mais c'est - comment dire - laid?

Cela fonctionne évidemment:

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

Y at-il une chance de résoudre ce problème?

Répondre

2

Il y a une autre façon, qui aura besoin de deux étapes, mais ne pas besoin de vous de traiter le XML sous forme de chaîne partout dans le processus:

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

L'expression XQuery passé à modify() fonction indique à SQL Server d'insérer le nœud d'instruction de traitement avant l'élément racine du XML.

MISE À JOUR:

a trouvé une autre alternative basée sur le fil suivant: Merge the two xml fragments into one?. Personnellement, je préfère cette façon:

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

Bonne contribution, merci! Jusqu'à ce qu'ils trouvent quelque chose comme 'top-processing-instruction()' c'est un très bon travail! – Shnugo

+0

Salut har07, je devais juste faire face à l'ajout de la déclaration xml et pensé, cela pourrait être fait de même, mais ce n'était pas le cas. J'ai ajouté une réponse avec la solution (assez évidente) ... – Shnugo

0

Comme il est sorti, une grande réponse har07 ne fonctionne pas avec un XML-déclaration. La seule façon que je pouvais trouver était la suivante:

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; 

Vous devez rester dans la ligne string après cette étape, toute conversion à XML réel va soit donner une erreur (lorsque l'encodage est autre que UTF-16) ou volonté ommit cette déclaration xml.