2012-05-14 12 views
5

Sto provando a convertire un file XML in un file piatto, delimitato da pipe con XSLT (per il caricamento di massa in Postgres). Vorrei che l'ultima colonna del mio output fosse l'effettivo XML del nodo (per ulteriore post-elaborazione e debug). Per esempio:come includere il nodo XML nel mio output di testo XSLT?

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

dovrebbe generare

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> 

mio XSL corrente è

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

risposta

0

Prova che:

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

Produce il seguente risultato dal file di input:

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

non sono sicuro se questa è una soluzione consigliata, ma si potrebbe provare a impostare il metodo di uscita per XML e quindi semplicemente utilizzando il xsl: copia del funzioni.

Così, il seguente 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> 

Quando applicato al tuo XML di esempio, genera il seguente output

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