Tsql XSLT-如何在文本输出模式下将原始XML放入转换结果

Tsql XSLT-如何在文本输出模式下将原始XML放入转换结果,tsql,xslt,Tsql,Xslt,我正在尝试创建一个转换,输出将是文本,但也包括原始xml。简单地说,我得到了应该转换为SQLINSERT的xml消息,但如果出现SQL错误,我还希望将原始xml消息插入数据库 输入为,例如: <message><tag name="foo">dummy</tag></message> dummy 然后,转换的结果应该是: INSERT INTO table (column) VALUES ('dummy') IF @@error <>

我正在尝试创建一个转换,输出将是文本,但也包括原始xml。简单地说,我得到了应该转换为SQLINSERT的xml消息,但如果出现SQL错误,我还希望将原始xml消息插入数据库

输入为,例如:

<message><tag name="foo">dummy</tag></message>
dummy
然后,转换的结果应该是:

INSERT INTO table (column) VALUES ('dummy')
IF @@error <> 0
BEGIN
   INSERT INTO errMsgLog (message) VALUES ('<message><tag name="foo">dummy</tag></message>')
END
插入表(列)值('dummy'))
如果@错误0
开始
插入到errMsgLog(消息)值('dummy')中
结束
问题是,如果我将XSLT中的输出设置为“text”,则不包含xml标记(仅包含值)。那么是否存在任何混合输出模式或属性覆盖


谢谢任何帮助。

在接近这个解决方案之前(不知道如果通过XSLT你可以找到更好的解决方案),也要考虑你会遇到的问题会更加复杂的输入和输出。p> 即使纯粹主义者会拒绝这个答案(以及这个问题),您也可以使用“xml”输出方法来做一个(非常难看的)诡计:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes"/>    
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <xsl:text disable-output-escaping="yes">INSERT INTO table (column) VALUES ('dummy')
IF @@error &lt;> 0
BEGIN
     INSERT INTO errMsgLog (message) VALUES ('</xsl:text>
        <xsl:copy-of select="."/><xsl:text>')
END</xsl:text>
    </xsl:template>

</xsl:stylesheet>

插入表(列)值('dummy')
如果@错误>0
开始
在errMsgLog(消息)值中插入('
')
结束
产出:

INSERT INTO table (column) VALUES ('dummy')
IF @@error <> 0
BEGIN
     INSERT INTO errMsgLog (message) VALUES ('<message><tag name="foo">dummy</tag></message>')
END
插入表(列)值('dummy'))
如果@错误0
开始
插入到errMsgLog(消息)值('dummy')中
结束

一些处理器(如Saxon)有一个扩展函数serialize(),它允许您将XML节点转换为序列化的XML表示形式,该函数以字符串形式返回。您可以调用它,然后在文本结果中输出它。如果您的处理器没有这样的扩展功能,那么编写一个扩展功能可能并不困难。

如果我理解@Michael的建议,那么这其中有一个原因(+1)谢谢您的好主意。我所要做的就是根本不设置输出模式(只省略xml声明=“yes”)。在我的示例中是的。这是因为xml是默认的输出方法。