以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  [原创]用XSLT 转换 XML格式问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=56248)


--  作者:xiaoyupan
--  发布时间:11/30/2007 10:01:00 PM

--  [原创]用XSLT 转换 XML格式问题
请各位高手指点一下,在一个xml文件里父节点下存在同名的子节点如下面的例子里<Shop>下有两个<Table>子节点,<Table>节点下又有相同的子节点<TR>. 想把这个xml结构用XSLT变一下如下面的例子:

原xml文件:
<Shop>
   <Table>
      <TR>
         <TH>ID</TH>
         <TH>Last Name</TH>
         <TH>First Name</TH>
         <TH>Product</TH>
         <TH>Price</TH>
      </TR>
      <TR>
         <TD>1000</TD>
         <TD>Chen</TD>
         <TD>jin</TD>
         <TD>CD1</TD>
         <TD>1,00</TD>
      </TR>
      <TR>
         <TD>1001</TD>
         <TD>Zhang</TD>
         <TD>San</TD>
         <TD>CD2</TD>
         <TD>1.50</TD>
      </TR>
      <TR>
         <TD>1002</TD>
         <TD>Li</TD>
         <TD>Si</TD>
         <TD>DVD1</TD>
         <TD>10.00</TD>
      </TR>
   </Table>
   <Table>
      <TR>
         <TH>PID</TH>
         <TH>Product Name</TH>
         <TH>Total</TH>
         <TH>Price</TH>
      </TR>
      <TR>
         <TD>5010</TD>
         <TD>CD1</TD>
         <TD>3000</TD>
         <TD>1,00</TD>
      </TR>
      <TR>
         <TD>6001</TD>
         <TD>CD2</TD>
         <TD>2500</TD>
         <TD>1.50</TD>
      </TR>
      <TR>
         <TD>10202</TD>
         <TD>DVD1</TD>
         <TD>500</TD>
         <TD>10.00</TD>
      </TR>
   </Table>
</Shop>

转变后想得到的结构:
<Shop>
   <table>
      <thead>
         <tr>
            <td>ID</td>
            <td>Last Name</td>
            <td>First Name</td>
            <td>Product</td>
            <td>Price</td>
         </tr>
      </thead>
      <tbody>
         <tr>
            <td>1000</td>
            <td>Chen</td>
            <td>jin</td>
            <td>CD1</td>
            <td>1.00</td>
         </tr>
         <tr>
            <td>1001</td>
            <td>Li</td>
            <td>Si</td>
            <td>CD2</td>
            <td>1.50</td>
         </tr>
         <tr>
            <td>1002</td>
            <td>Zhang</td>
            <td>San</td>
            <td>DVD1</td>
            <td>10.00</td>
         </tr>
      </tbody>
   </table>
   <table>
      <thead>
         <tr>
            <td>PID</td>
            <td>Product Name</td>
            <td>Total</td>
            <td>Price</td>
         </tr>
      </thead>
      <tbody>
         <tr>
            <td>5010</td>
            <td>CD1</td>
            <td>3000</td>
            <td>1,00</td>
         </tr>
         <tr>
            <td>6001</td>
            <td>CD2</td>
            <td>2500</td>
            <td>1.50</td>
         </tr>
         <tr>
            <td>10202</td>
            <td>DVD1</td>
            <td>500</td>
            <td>10.00</td>
         </tr>
      </tbody>
   </Table>
</Shop>

我写了xsl文件:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "xml"  omit-xml-declaration = "yes" indent = "yes"/>
  <xsl:template match="/">
    <xsl:apply-templates select="Shop/Table"/>
  </xsl:template>
  <xsl:template match="Table">
    <table>
      <thead>
        <xsl:for-each select="//TR[position()=1]">
          <tr>
            <xsl:for-each select="//TR[position()=1]/TH">
              <td>
   <xsl:value-of select="text()"/>
 </td>
            </xsl:for-each>
          </tr>
        </xsl:for-each> 
      </thead>
      <tbody>
        <xsl:for-each select="//TR[position()>=2]">
          <tr>
            <xsl:for-each select="//TR[position()>=2]/*">
              <td>
                <xsl:value-of select="text()"/>
              </td>
            </xsl:for-each>
          </tr>
        </xsl:for-each> 
      </tbody>  
    </table>
  </xsl:template>
</xsl:stylesheet>

结果:
<table>
   <thead>
      <tr>
         <td>ID</td>
         <td>Last Name</td>
         <td>First Name</td>
         <td>Product</td>
         <td>Price</td>
         <td>PID</td>
         <td>Product Name</td>
         <td>Total</td>
         <td>Price</td>
      </tr>
      <tr>
         <td>ID</td>
         <td>Last Name</td>
         <td>First Name</td>
         <td>Product</td>
         <td>Price</td>
         <td>PID</td>
         <td>Product Name</td>
         <td>Total</td>
         <td>Price</td>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td>1000</td>
         <td>Chen</td>
         <td>jin</td>
         <td>CD1</td>
         <td>1,00</td>
         <td>1001</td>
         <td>Zhang</td>
         <td>San</td>
         <td>CD2</td>
         <td>1.50</td>
         <td>1002</td>
         <td>Li</td>
         <td>Si</td>
         <td>DVD1</td>
         <td>10.00</td>
         <td>5010</td>
         <td>CD1</td>
         <td>3000</td>
         <td>1,00</td>
         <td>6001</td>
         <td>CD2</td>
         <td>2500</td>
         <td>1.50</td>
         <td>10202</td>
         <td>DVD1</td>
         <td>500</td>
         <td>10.00</td>
      </tr>
接下来5个同样的<tr>...</tr>
      <tr>
      ......
      </tr>
<table>  

怎样将两个<Table>分开写道新的结构里呢?谢谢各位的指点!


--  作者:Qr
--  发布时间:12/1/2007 9:14:00 AM

--  
这大概是你想要的结果吧,没有细细核对输出的格式。
<?xml version="1.0" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "xml"  omit-xml-declaration = "yes" indent = "yes"/>
  <xsl:template match="/">
<Shop>
    <xsl:apply-templates select="//Table"/>
</Shop>
  </xsl:template>
  <xsl:template match="Table">
    <table>
      <thead>
        <xsl:for-each select="TR[position()=1]">
          <tr>
            <xsl:for-each select="TH">
              <td>
   <xsl:value-of select="text()"/>
</td>
            </xsl:for-each>
          </tr>
        </xsl:for-each>
      </thead>
      <tbody>
        <xsl:for-each select="TR[position()>=2]">
          <tr>
            <xsl:for-each select="TD">
              <td>
                <xsl:value-of select="text()"/>
              </td>
            </xsl:for-each>
          </tr>
        </xsl:for-each>
      </tbody>  
    </table>
  </xsl:template>
</xsl:stylesheet>
--  作者:xiaoyupan
--  发布时间:12/3/2007 4:25:00 PM

--  
Qr, 非常感谢!是的,就要这样的结果!我同时也分析了自己的错误!谢谢!
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
4,429.688ms