2012-05-14 84 views
5

我想将XML文件转换为一个带XSLT的管道分隔文件(用于批量加载到Postgres中)。我希望输出中的最后一列是节点的实际XML(用于其他后处理和调试)。例如:如何在我的XSLT文本输出中包含节点XML?

<Library> 
    <Book id="123"> 
    <Title>Python Does Everythig</Title> 
    <Author>Smith</Author> 
    </Book> 

    <Book id="456"> 
    <Title>Postgres is Neat</Title> 
    <Author>Wesson</Author> 
    </Book> 
</Library> 

应该产生

Python Does Everything|Smith|<Book id="123"><Title>Python Does Everythig</Title>Author>Smith</Author></Book> 
Postgres is Neat|Wesson|<Book id="456"><Title>Postgres is Neat</Title><Author>Wesson</Author></Book> 

我现在的XSL是

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:strip-space elements="*" /> 
    <xsl:output method="text" omit-xml-declaration="yes" indent="no" /> 
    <xsl:template match="//Book"> 
    <xsl:value-of select="Title" /> 
    <xsl:text>|</xsl:text> 
    <xsl:value-of select="Author" /> 

    <!-- put in the newline --> 
    <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet>  

回答

0

试一下:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="//Book"/> 
    </xsl:template> 
    <xsl:template match="Book"> 
     <xsl:value-of select="Title" /> 
     <xsl:text>|</xsl:text> 
     <xsl:value-of select="Author" /> 
     <xsl:text>|</xsl:text> 
     <xsl:apply-templates select="." mode="outputTags"/> 
    </xsl:template> 
    <xsl:template match="*" mode="outputTags"> 
     <xsl:text>&lt;</xsl:text> 
     <xsl:value-of select="local-name()"/> 
     <xsl:apply-templates select="@*"/> 
     <xsl:text>></xsl:text> 
     <xsl:apply-templates mode="outputTags"/> 
     <xsl:text>&lt;/</xsl:text> 
     <xsl:value-of select="local-name()"/> 
     <xsl:text>></xsl:text> 
     <xsl:if test="self::Book"> 
      <xsl:text>&#x0A;</xsl:text> 
     </xsl:if> 
    </xsl:template> 
    <xsl:template match="@*"> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="local-name()"/> 
     <xsl:text>="</xsl:text> 
     <xsl:value-of select="."/> 
     <xsl:text>"</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

它从你的输入文件将产生以下结果:

Python Does Everythig|Smith|<Book id="123"><Title>Python Does Everythig</Title><Author>Smith</Author></Book> 
Postgres is Neat|Wesson|<Book id="456"><Title>Postgres is Neat</Title><Author>Wesson</Author></Book> 
9

我不知道如果这是一个推荐的解决方案,但你可以尝试输出方式设置为XML,然后只使用的xsl:功能复制的。

所以,下面的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:strip-space elements="*" /> 
    <xsl:output method="xml" omit-xml-declaration="yes" indent="no" /> 
    <xsl:template match="//Book"> 
    <xsl:value-of select="Title" /> 
    <xsl:text>|</xsl:text> 
    <xsl:value-of select="Author" /> 
    <xsl:text>|</xsl:text> 
    <xsl:copy-of select="." /> 
    <!-- put in the newline --> 
    <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

当适用于您的示例XML,产生如下的输出

Python Does Everythig|Smith|<Book id="123"><Title>Python Does Everythig</Title><Author>Smith</Author></Book> 
Postgres is Neat|Wesson|<Book id="456"><Title>Postgres is Neat</Title><Author>Wesson</Author></Book> 
相关问题