3

我有一个类似于下面的xml

<DataSet1>
    <Table1>
        <Column1>Value111</Column1>
        <Column2>Value112</Column2>
    </Table1>
    <Table1>
        <Column1>Value121</Column1>
        <Column2>Value122</Column2>
    </Table1>
    <Table1>
        <Column1>Value131</Column1>
        <Column2>Value132</Column2>
    </Table1>
    <Table2>
        <Column1>Value211</Column1>
        <Column2>Value212</Column2>
    </Table2>
    <Table2>
        <Column1>Value221</Column1>
        <Column2>Value222</Column2>
    </Table2>
    <Table2>
        <Column1>Value231</Column1>
        <Column2>Value232</Column2>
    </Table2>
</DataSet1>

其中 Table1 和 Table2 是在数据集中动态添加的。所以数据集中可以有n个表作为Tablen。

我想编写生成 html 的 xsl,如下所示

Table1
<table>
    <tr>
        <td>Value111</td>
        <td>Value112</td>
    </tr>
    <tr>
        <td>Value121</td>
        <td>Value122</td>
    </tr>
    <tr>
        <td>Value131</td>
        <td>Value132</td>
    </tr>   
</table>

Table2
<table>
    <tr>
        <td>Value211</td>
        <td>Value212</td>
    </tr>
    <tr>
        <td>Value221</td>
        <td>Value222</td>
    </tr>
    <tr>
        <td>Value231</td>
        <td>Value232</td>
    </tr>
</table>

有没有办法选择 xsl 模板作为 select="DataSet1/Table*" 可以匹配任何表并迭代结构?

请帮忙!!!。

4

2 回答 2

2

这种转变

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kTableByName" match="*[starts-with(name(),'Table')]"
  use="name()"/>

 <xsl:template match=
  "*[generate-id()
    =
     generate-id(key('kTableByName', name())[1])
     ]">
  <xsl:value-of select="concat('&#xA;', name(), '&#xA;')"/>
  <table>
   <xsl:apply-templates select="key('kTableByName', name())" mode="inGroup"/>
  </table>
 </xsl:template>

 <xsl:template match="*[starts-with(name(),'Table')]" mode="inGroup">
  <tr>
    <xsl:apply-templates select="*" mode="inGroup"/>
  </tr>
 </xsl:template>

 <xsl:template match="*[starts-with(name(),'Table')]/*" mode="inGroup">
  <td>
    <xsl:value-of select="."/>
  </td>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

应用于提供的 XML 文档时

<DataSet1>
    <Table1>
        <Column1>Value111</Column1>
        <Column2>Value112</Column2>
    </Table1>
    <Table1>
        <Column1>Value121</Column1>
        <Column2>Value122</Column2>
    </Table1>
    <Table1>
        <Column1>Value131</Column1>
        <Column2>Value132</Column2>
    </Table1>
    <Table2>
        <Column1>Value211</Column1>
        <Column2>Value212</Column2>
    </Table2>
    <Table2>
        <Column1>Value221</Column1>
        <Column2>Value222</Column2>
    </Table2>
    <Table2>
        <Column1>Value231</Column1>
        <Column2>Value232</Column2>
    </Table2>
</DataSet1>

产生想要的正确结果

Table1
<table>
   <tr>
      <td>Value111</td>
      <td>Value112</td>
   </tr>
   <tr>
      <td>Value121</td>
      <td>Value122</td>
   </tr>
   <tr>
      <td>Value131</td>
      <td>Value132</td>
   </tr>
</table>
Table2
<table>
   <tr>
      <td>Value211</td>
      <td>Value212</td>
   </tr>
   <tr>
      <td>Value221</td>
      <td>Value222</td>
   </tr>
   <tr>
      <td>Value231</td>
      <td>Value232</td>
   </tr>
</table>

说明

正确使用Muenchian Grouping方法

于 2012-09-03T15:26:48.667 回答
0

您是否尝试过xPath 上的 w3Schools 教程?有一个 * 选择器,它允许您选择某个节点的所有子节点,如下所示:DataSet1/*

于 2012-09-03T15:08:25.517 回答