XSLT - 如何将原始XML转换为文本输出模式的转换结果

时间:2011-09-01 12:55:09

标签: tsql xslt

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

输入是例如:

<message><tag name="foo">dummy</tag></message>

转换的结果应该是:

INSERT INTO table (column) VALUES ('dummy')
IF @@error <> 0
BEGIN
   INSERT INTO errMsgLog (message) VALUES ('<message><tag name="foo">dummy</tag></message>')
END

问题是如果我将XSLT中的输出设置为'text',则不包含xml标签(只是值)。那么是否有任何混合输出模式或属性覆盖?

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

在接近这个解决方案之前(不知道是否可以通过XSLT找到更好的解决方案),还要考虑更复杂的输入和输出会遇到的问题。

即使纯粹主义者会拒绝这个答案(也是问题),你可以使用“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>

输出:

INSERT INTO table (column) VALUES ('dummy')
IF @@error <> 0
BEGIN
     INSERT INTO errMsgLog (message) VALUES ('<message><tag name="foo">dummy</tag></message>')
END

答案 1 :(得分:1)

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