以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  xsl转换数据难题.  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=10151)


--  作者:soonwind
--  发布时间:9/20/2004 12:03:00 PM

--  xsl转换数据难题.
<?xml version="1.0" encoding="utf-8" ?>
<root>
 <ta1>
  <row>
   <a>aaa</a>
   <b>bbb</b>
  </row>
  <row>
   <a>aaa2</a>
   <b>bbb2</b>
  </row>
 </ta1>
 <ta2>
  <row>
   <c>ccc</c>
   <d>ddd</d>
  </row>
  <row>
   <c>ccc2</c>
   <d>ddd2>
  </row>
 </ta2>
</root>
上面的xml文件转换成下面格式的xml文件,方法用xsl转换
<root>
 <ta>
  <row>
   <a>aaa</a>
   <b>bbb</b>
   <c>ccc</c>
   <d>ddd</d>
  </row>
  <row>
   <a>aaa2</a>
   <b>bbb2</b>
   <c>ccc2</c>
   <d>ddd2</d>
  </row>
 </ta>
</root>
--  作者:soonwind
--  发布时间:9/21/2004 9:08:00 AM

--  
doubleG 请帮帮忙呀!这个论坛上都说你很历害的。
--  作者:doubleG
--  发布时间:9/21/2004 1:17:00 PM

--  
<?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" version="1.0"  encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
 <xsl:element name="root">
  <xsl:element name="ta">
   <xsl:call-template name="reBuild">
    <xsl:with-param name="currentNode" select="root/child::*[position()=1]"/>
   </xsl:call-template>
  </xsl:element>
 </xsl:element>
</xsl:template>

<xsl:template name="reBuild">
 <xsl:param name="currentNode"/>
  <xsl:for-each select="$currentNode/child::*">
  <xsl:element name="row">
   <xsl:call-template name="createNewRow">
    <xsl:with-param name="rowNode" select="."/>
    <xsl:with-param name="nodePos" select="position()"/>
   </xsl:call-template>
  </xsl:element>
 </xsl:for-each>
</xsl:template>

<xsl:template name="createNewRow">
 <xsl:param name="rowNode"/>
 <xsl:param name="nodePos"/>
  <xsl:for-each select="$rowNode/child::*">
  <xsl:element name="{name(.)}">
   <xsl:value-of select="."/>
  </xsl:element>
 </xsl:for-each>
  <xsl:for-each select="$rowNode/parent::node()/following-sibling::*[position()=1]/child::*[$nodePos]/child::*">
  <xsl:element name="{name(.)}">
   <xsl:value-of select="."/>
  </xsl:element>
 </xsl:for-each>
</xsl:template>
</xsl:stylesheet>


--  作者:soonwind
--  发布时间:9/22/2004 1:31:00 PM

--  
谢谢doubleG !我回去试一试!
--  作者:菜籽
--  发布时间:9/27/2004 2:36:00 PM

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