以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  请高手赐教!  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=10548)


--  作者:nnpp
--  发布时间:9/23/2004 6:41:00 PM

--  请高手赐教!
<?xml version="1.0" encoding="gb2312" ?>
<tree>
 <entity id="5" kind="年级">
  <title>五年级</title>
  <detail>
   <entity id="121" kind="班级">
    <title>甲班</title>
    <detail>
     <entity id="1089" kind="学生">
      <title>小王</title>
      <detail>
       <entity id="20002" kind="语文">
        <title>85</title>
        <detail></detail>
       </entity>
      </detail>
     </entity>
     <entity id="1089" kind="学生">
      <title>小王</title>
      <detail>
       <entity id="20003" kind="数学">
        <title>80</title>
        <detail></detail>
       </entity>
      </detail>
     </entity>
     <entity id="1090" kind="学生">
      <title>小张</title>
      <detail>
       <entity id="20003" kind="数学">
        <title>75</title>
        <detail></detail>
       </entity>
      </detail>
     </entity>
    </detail>
   </entity>
  </detail>
 </entity>
</tree>
如何使用xsl将以上xml格式转换为以下xml格式?
<?xml version="1.0" encoding="gb2312" ?>
<tree>
 <entity id="5" kind="年级">
  <title>五年级</title>
  <detail>
   <entity id="121" kind="班级">
    <title>甲班</title>
    <detail>
     <entity id="1089" kind="学生">
      <title>小王</title>
      <detail>
       <entity id="20002" kind="语文">
        <title>85</title>
        <detail></detail>
       </entity>
       <entity id="20003" kind="数学">
        <title>80</title>
        <detail></detail>
       </entity>
      </detail>
     </entity>
     <entity id="1090" kind="学生">
      <title>小张</title>
      <detail>
       <entity id="20003" kind="数学">
        <title>75</title>
        <detail></detail>
       </entity>
      </detail>
     </entity>
    </detail>
   </entity>
  </detail>
 </entity>
</tree>
--  作者:doubleG
--  发布时间:9/24/2004 9:33:00 AM

--  
朋友,我知道问题解决不出来的时候是很焦急的。但是大家都有自己要做的事情,可能一时半会儿不能帮你解决。不用发那么多贴子啊,好吗?呵呵 你的XML这样设计不是很好,不过慢慢体会就能改进了,我按照你的要求写了,有些模块化做得不好,你自己看懂修改就好了。
XSL如下(xmlspy2004下通过,你用的浏览器要支持xsl:key。不过一般都支持,呵呵):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" encoding="GB2312" indent="yes"/>
<xsl:key name="entityID" match="entity" use="@id"/>
<xsl:template match="/">
 <xsl:element name="tree">
  <xsl:for-each select="//entity[@kind='年级']"> 
   <xsl:call-template name="ReOrderGrade"/>
  </xsl:for-each>
 </xsl:element>
</xsl:template>

<xsl:template name="ReOrderGrade">
 <xsl:element name="detail">
  <xsl:element name="{name(.)}">
   <xsl:call-template name="SetAttribute"/>
   <xsl:call-template name="SetTitle"/>     
   <xsl:for-each select=".//detail/entity[@kind='班级']">
    <xsl:call-template name="ReOrderClass"/>
   </xsl:for-each>
  </xsl:element>
 </xsl:element>
</xsl:template>

<xsl:template name="ReOrderClass">
 <xsl:variable name="classNode" select="."/>
 <xsl:element name="detail">
  <xsl:element name="{name(.)}">  
   <xsl:for-each select="./detail/entity[generate-id()=generate-id(key('entityID',@id))]">
    <xsl:element name="{name(.)}">
     <xsl:call-template name="SetAttribute"/>
     <xsl:call-template name="SetTitle"/> 
    </xsl:element>
    <xsl:element name="detail">
     <xsl:variable name="EID" select="@id"/>
     <xsl:for-each select="$classNode//entity[@id=$EID]">
      <xsl:call-template name="SetExam"/>
     </xsl:for-each>
    </xsl:element>
   </xsl:for-each>
  </xsl:element>
 </xsl:element>
</xsl:template>

<xsl:template name="SetTitle">
 <xsl:element name="title">
  <xsl:value-of select="./title"/>
 </xsl:element>
</xsl:template>

<xsl:template name="SetAttribute">
  <xsl:for-each select="./attribute::*">
  <xsl:attribute name="{name(.)}">
   <xsl:value-of select="."/>
  </xsl:attribute>
 </xsl:for-each>
</xsl:template>

<xsl:template name="SetExam">
 <xsl:for-each  select="./detail/entity">
  <xsl:element name="entity">
   <xsl:call-template name="SetAttribute"/>
   <xsl:call-template name="SetTitle"/>
  </xsl:element>
  <xsl:element name="detail"/>
 </xsl:for-each>
</xsl:template>
</xsl:stylesheet>


--  作者:nnpp
--  发布时间:9/24/2004 3:07:00 PM

--  谢谢你,DoubleG!
不好意思,发多了!以后注意!谢谢你能回复我的帖子。谢了!

W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
94.238ms