2011-09-01 52 views
5

我想创建一个转换,其输出将是文本,但也包括原始xml。简单地说,我得到了应该转换为SQL插入的xml消息,但是如果出现SQL错误,我想将原始xml消息插入到数据库中。XSLT - 如何将原始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标签包括(只是值)。那么是否有混合输出模式或属性重写?

感谢您的任何帮助。

回答

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 
+0

谢谢你的好主意。我所要做的不是设置输出模式(只有omit-xml-declaration =“yes”)。 –

+0

是的,就像我的例子。这是因为xml是默认的输出方法。 –

1

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

+0

这里有一个** [很好的线程](http://stackoverflow.com/questions/6696382/xslt-how-to-convert-xml-node-to-string)**,如果我是了解@Michael建议的内容(+1) –