【问题标题】:transform all xml elements into txt with xslt使用 xslt 将所有 xml 元素转换为 txt
【发布时间】:2012-01-25 23:45:59
【问题描述】:

我想遍历 xml 中的所有节点和子节点(递归)并将元素转换为 txt 格式。例如:

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

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

  • 元素名称仅针对根节点进行转换
  • 如果有空元素就有空行(我想禁止空行)

谢谢

【问题讨论】:

    标签: xml xslt xpath


    【解决方案1】:

    用途:

    <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
    

    【讨论】:

    • 感谢基里尔,您的解决方案看起来不错,但我需要格式化输出(这是另一个要求)。输出 txt 应该与输入 xml 对应(请参阅我的问题:txt 输出表示)。您示例的输出全部推送到一行中。你能告诉我如何格式化输出吗?谢谢。
    • @zosim,不要设置&lt;xsl:strip-space elements="*" /&gt;
    • 我发现了它被推送的原因..因为我正在查看 Firefox 中的输出。有它仍然被推。但是当我将它复制并粘贴到编辑器时,它会正确显示(格式可以)。另一个有趣的发现是,如果我在 IE 9 中查看输出,则只显示数据(缺少元素名称,也缺少空元素)。
    • @zosim, 尝试设置&lt;xsl:output method="text" /&gt;
    • 它有帮助。现在一切正常。非常感谢。
    【解决方案2】:

    尝试替换:

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

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

    您可以使用if 测试空值:

    <if test="text() = '' >
    

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

    【讨论】:

      【解决方案3】:

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

      <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
      

      【讨论】:

        猜你喜欢
        • 2017-01-12
        • 1970-01-01
        • 2010-10-13
        • 2018-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多