2012-05-14 12 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あなたのサンプルXMLに適用

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

は、次のような出力を生成します

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>