如何在XSLT文本输出中包含节点XML?

5

我正在尝试使用XSLT将XML文件转换为平面的、以管道符分隔的文件(用于批量加载到Postgres中)。 我希望输出中的最后一列是节点的实际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>    
2个回答

9
我不确定这是否是推荐的解决方案,但您可以尝试将输出方法设置为xml,然后只使用xsl:copy-of函数。因此,以下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>

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接