递归xsl转换

问题描述:

我有以下格式的xml文档,并希望使用xsl模板进行转换。递归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 | 
    '---------------------------------------------' 
+0

如果你不想要XML输出,你为什么要使用XSL? – Oded 2010-06-04 08:14:54

+0

请参阅更新(我希望输出的格式与div/html相同) – dacwe 2010-06-04 08:42:57

+0

@Oded:XSL除了输出XML外还有其他用途。仅举几例,它可以像dacwe想要的那样输出到html,如果使用XSL-FO它可以生成PDF文件,甚至可以生成另一个XSL文档!如此多的选项和功能..它不仅限于生成xml :) – developer 2010-06-10 21:25:51

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

将数据添加到下两栏非常简单,请尝试自行完成。