使用xslt将所有xml元素转换为文本

时间:2011-12-22 09:50:27

标签: xml xslt xpath

我想在xml中迭代所有节点和子节点(递归地)并将元素转换为txt格式。 E.g:

<root>
  <level>
    <data1>data1</data1>
    <sublevel>
       <data2>data2</data2>
    </sublevel>
  </level>
</root>

我希望以txt格式输出以下内容:

root
  level
    data1:data1
    sublevel
      data2:data2

我目前的xslt转换是:

<xsl:strip-space elements="*" />

<xsl:template match="/">
  <xsl:for-each select="*">
    <xsl:value-of select="local-name()"/>: <xsl:value-of select="."/><xsl:text>&#xa;</xsl:text>
  </xsl:for-each>
</xsl:template>

但它不会产生所需的输出。有一些错误:

  • 仅为根节点
  • 转换元素的名称
  • 如果有空元素(我想压制空行),则有空行

感谢

3 个答案:

答案 0 :(得分:0)

尝试更换:

xsl:value-of select="local-name()"

xsl:value-of select="text()"

您可以使用if

测试空值
<if test="text() = '' >

我没有测试过代码,但是应该给你一个想法。

答案 1 :(得分:0)

使用:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="*">
        <xsl:value-of select="local-name()"/>

        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="text()[normalize-space(.)]">
        <xsl:value-of select="concat(':', .)"/>
    </xsl:template>
</xsl:stylesheet>

MSXSL输出:

root
    level
        data1:data1
        sublevel
            data2:data2

答案 2 :(得分:0)

下面可能是一个很好的推动正确的方向:输出需要缩进和子元素不输出 - 但我想你将能够弄明白: - )。

<xsl:template match="/root">
    <xsl:call-template name="nodeToText"/>
</xsl:template>

<xsl:template name="nodeToText">
    <xsl:value-of select="local-name()"/>: <xsl:value-of select="."/><xsl:text>&#xa;</xsl:text>
    <xsl:for-each select="child::*">
        <xsl:call-template name="nodeToText"/>
    </xsl:for-each>
</xsl:template>

这导致以下输出:

root: data1data2
level: data1data2
data1: data1
sublevel: data2
data2: data2