以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  用xsl生成XML树格式  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=63319)


--  作者:apple77
--  发布时间:6/1/2008 1:05:00 PM

--  用xsl生成XML树格式
各位前辈,刚学XML碰到如下问题,想了好久不知道错在哪,请大家指教,谢谢帮助。

任务:将一个xml文件从无层次格式(源文件格式)转到有层次格式(目标文件格式)
测试数据:
源XML文件
<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet type="text/xsl" href="test.xsl" ?>
<tree_tests>
<tree_test ID="1" PARENT_ID="0" NAME="ROOT      " SIZE="0         " CHILDFLAG="T"/>
<tree_test ID="2" PARENT_ID="1" NAME="A         " SIZE="13        " CHILDFLAG="T"/>
<tree_test ID="3" PARENT_ID="1" NAME="B         " SIZE="23        " CHILDFLAG="T"/>
<tree_test ID="4" PARENT_ID="1" NAME="C         " SIZE="1         " CHILDFLAG="T"/>
<tree_test ID="5" PARENT_ID="2" NAME="A.A1      " SIZE="34        " CHILDFLAG="T"/>
<tree_test ID="6" PARENT_ID="2" NAME="A.A2      " SIZE="6         " CHILDFLAG="F"/>
<tree_test ID="7" PARENT_ID="5" NAME="A.A1.1    " SIZE="7         " CHILDFLAG="T"/>
<tree_test ID="8" PARENT_ID="5" NAME="A.A1.2    " SIZE="5         " CHILDFLAG="T"/>
<tree_test ID="9" PARENT_ID="2" NAME="A.A3      " SIZE="3         " CHILDFLAG="F"/>
<tree_test ID="10" PARENT_ID="3" NAME="B.B1      " SIZE="5         " CHILDFLAG="T"/>
<tree_test ID="11" PARENT_ID="4" NAME="C.C1      " SIZE="6         " CHILDFLAG="F"/>
<tree_test ID="12" PARENT_ID="10" NAME="B.B1.1    " SIZE="6         " CHILDFLAG="F"/>
<tree_test ID="13" PARENT_ID="7" NAME="A.A1.1.a  "  SIZE="12         " CHILDFLAG="F"/>
</tree_tests>
目标XML文件希望如下:
<tree_test ID="1" NAME="ROOT"  >
      <tree_test ID="2"  NAME="A"  >  
                <tree_test ID="5" NAME="A.A1 ">
                       <tree_test ID="7"  NAME="A.A1.1 >
                                  <tree_test ID="13"  NAME="A.A1.1.a  ">
                      <tree_test ID="8"  NAME="A.A1.2 >
                <tree_test ID="6" NAME="A.A2 ">
       <tree_test ID="3"  NAME="B" >
               <tree_test ID="10"  NAME="B.B1" >
                         <tree_test ID="12" NAME="B.B1.1" >
       <tree_test ID="4" NAME="C" >
              <tree_test ID="11"  NAME="C.C1">
</tree_test>

我的XLS
<?xml version="1.0" encoding="gb2312" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
    <xsl:call-template name="treetemplate">
      <xsl:with-param name="parent_id" select="0"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="treetemplate">
    <xsl:param name="parent_id"/>
    <xsl:for-each select="/tree_tests/tree_test[@PARENT_ID=$parent_id]">
      <xsl:value-of select="." />  <!--不显示,因为无值-->
      <br/>
      <xsl:value-of select="$parent_id"/>
      <br/>
      Id: <xsl:value-of select="./@ID"/>
      <br/>
      PARENT_ID:<xsl:value-of select="./@PARENT_ID"/><br/>
      NAME: <xsl:value-of select="./@NAME"/><br/>
      SIZE: <xsl:value-of select="./@SIZE"/><br/>
      CHILDFLAG:<xsl:value-of select="./@CHILDFLAG"/>
      <br/>
    </xsl:for-each>
    <xsl:if test="CHILDFLAG='T'">
      <xsl:call-template name="treetemplate">        
          <xsl:with-param name="parent_id" select="./@ID"/>        
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

递归有问题,但我想不出问题在哪


--  作者:bigsea76
--  发布时间:6/2/2008 9:18:00 AM

--  
XPath函数中有专门关于字符串的函数,如startwith这样的函数,试试吧
--  作者:Qr
--  发布时间:6/2/2008 1:35:00 PM

--  
http://bbs.xml.org.cn/dispbbs.asp?boardID=8&ID=20240
--  作者:apple77
--  发布时间:6/2/2008 9:38:00 PM

--  鞠躬感谢
谢谢您的指点,帮助我提高. 这坛子真是好地方,能认识你们觉得自己真幸运。
--  作者:Qr
--  发布时间:6/2/2008 9:58:00 PM

--  
已经在CSDN和本人的BLOG上贴过代码,http://blogger.org.cn/blog/more.asp?name=Qr&id=36322
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms