代码之家  ›  专栏  ›  技术社区  ›  dacwe

递归XSL转换

  •  1
  • dacwe  · 技术社区  · 14 年前

    我有一个以下格式的XML文档,希望使用XSL模板对其进行转换。

    我是XSL转换的初学者,我只需要知道如何通过树进行递归,但是对于整个问题的解决方案是很好的。

    这是XML文档:

    <?xml version="1.0" encoding="UTF-8" ?>
    <nodes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <node>
            <type>Parent</type>
            <name>.test</name>
            <node>
                <type>parent</type>
                <name>.test.root</name>
                <node>
                    <type>Parent</type>
                    <name>.test.root.group</name>
                    <node>
                        <type>int</type>
                        <name>.test.root.group.a</name>
                        <value>0</value>
                    </node>
                    <node>
                        <type>char</type>
                        <name>.test.root.group.b</name>
                        <value>-</value>
                    </node>
                </node>
            </node>
            <node>
                <type>parent</type>
                <name>.test.versions</name>
                <node>
                    <type>utf-8</type>
                    <name>.test.versions.version</name>
                    <value>alpha</value>
                </node>
                <node>
                    <type>utf-8</type>
                    <name>.test.version.extra</name>
                    <value>16.5</value>
                </node>
            </node>
        </node>
    </nodes>
    

    我希望生成的HTML如下所示:

        .---------------------------------------------.
        | tree                   | value     | type   |
        |------------------------+-----------+--------|
        | '- test                |           | parent |
        |    |- root             |           | parent |
        |    |  '- group         |           | parent |
        |    |     |- a          | 0         | int    |
        |    |     '- b          | -         | char   |
        |    '- versions         |           | parent |
        |       |- version       | "alpha"   | utf-8  |
        |       '- extra         | 16.5      | utf-8  |
        '---------------------------------------------'
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   darja    14 年前

    此XSLT将生成所需的树:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="text" indent="yes"/>
    
      <xsl:template match="/">
        <xsl:apply-templates select="nodes/node">
          <xsl:with-param name="indent" select="''" />
          <xsl:with-param name="parent" select="''" />
        </xsl:apply-templates>
      </xsl:template>
    
      <xsl:template match="node">
        <xsl:param name="indent"/>
        <xsl:param name="parent"/>
    
        <xsl:value-of select="$indent" />
        <xsl:value-of select="substring-after(name/text(), $parent)" />
        <xsl:text>&#xa;</xsl:text>
    
        <xsl:apply-templates select="./node">
          <xsl:with-param name="indent" select="concat($indent, '    |')" />
          <xsl:with-param name="parent" select="name/text()" />
        </xsl:apply-templates>
    
      </xsl:template>
    
    </xsl:stylesheet>
    

    在接下来的两列中添加数据非常简单,请尝试自己完成。