-2

我想在我的 xslt 代码中动态地将表分成三个。给我结构以在特定节点处附加我的文本,例如如果我有 100 个节点,我需要在第 33 个第 66 个节点处附加我的文本。

我的 XSLT 代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

<xsl:key name="routes-by-origin" match="/schedules/Routes/org" use="./text()"/>
<xsl:template match="schedules" name="Main">
<html>
<head></head>
<body>
<table>
<tr> <td> Heading </td> </tr>
<table>
<xsl:for-each select="Routes/org[generate-id(.) = generate-id(key('routes-by-origin',.)[1])]">
   <xsl:value-of select="./text()"/>
  <xsl:apply-templates select="//Routes[org/text() = current()/text()]"/>
     </xsl:for-each>
    </table>
   </xsl:template>

从上面的模板调用的模板设计

   <xsl:template match="Routes">
  <xsl:value-of select="des/text()"/>
<xsl:variable name="via" select="Via/text()"/>
 <xsl:value-of select="Flgno/text()"/>
</xsl:template>
 </xsl:stylesheet>

输入文件

<schedules>
    <Routes>
        <org>Agartala</org>
        <des>Bangalore</des>
        <Flgno>SG 872</Flgno>
        <Via>CCU, HYD</Via>
    </Routes>
    <Routes>
        <org>Agartala</org>
        <des>Guwahati</des>
        <Flgno>SG 873</Flgno>
        <Via> BOM </Via>
    </Routes>
    <Routes>
        <org>Agartala</org>
        <des>Hyderabad</des>
        <Flgno>SG 872</Flgno>
        <Via>CCU</Via>
    </Routes>
    <Routes>
        <org>Agartala</org>
        <des>Kolkata</des>
        <Flgno>SG 872</Flgno>
        <Via> - </Via>
    </Routes>
    <Routes>
        <org>Agartala</org>
        <des>Kolkata</des>
        <Flgno>SG 874</Flgno>
        <Via> - </Via>
    </Routes>
    <Routes>
        <org>Agartala</org>
        <des>Mumbai</des>
        <Flgno>SG 874</Flgno>
        <Via>CCU</Via>
    </Routes>
    <Routes>
        <org>Ahmedabad</org>
        <des>Bangalore</des>
        <Flgno>SG 528</Flgno>
        <Symbols> - </Symbols>
        <Via>BOM</Via>
    </Routes>
</schedules>

预期结果

我的输出应该在一个页面中的三个表中:在第一个表中前 2 条记录第二表 - 下 2 条记录第三表最后 3 条记录

2 条记录 2 条记录 3 条记录
<table>
    <table>
        <tr>
            <td>Agartala</td>
            <td>Bangalore</td>
            <td>SG 872</td>
            <td>CCU</td>
        </tr>
        <tr>
            <td> Agartala</td>
            <td>Guwahati</td>
            <td>SG 87</td>
            <td>BOM</td>
        </tr>
    </table>
    <table>
        <tr>
            <td>Agartala</td>
            <td>Hyderabad</td>
            <td>SG 872 </td>
            <td>CCU</td>
        </tr>
        <tr>
            <td>Agartala</td>
            <td>Kolkatta</td>
            <td>SG 872</td>
            <td> - </td>
        </tr>
    </table>
    <table>
        <tr>
            <td> Agartala</td>
            <td>Kolkatta</td>
            <td>SG 874</td>
            <td> - </td>
        </tr>
        <tr>
            <td>Agartala</td>
            <td>Mumbai</td>
            <td>SG 874 </td>
            <td>CCU</td>
        </tr>
        <tr>
            <td>Agartala</td>
            <td>Bangalore</td>
            <td>SG 528</td>
            <td>BOM</td>
        </tr>
    </table>
</table>

注意:我的输入数据是动态的

4

1 回答 1

0

这个 XSLT 1.0 样式表是 Dimitre在此处的解决方案的副本,针对 OP 的特定数据稍作调整,并使第三个表具有 ceil(row-count / 3) 行。

XSLT 1.0 解决方案

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:variable name="prowLimit" select="floor(count(/*/Routes) div 3)" />

<xsl:template match="/">
 <table>
   <xsl:apply-templates select="*/Routes" />
 </table>
</xsl:template>

<xsl:template match="Routes">
 <xsl:if test="(position() mod $prowLimit = 1) and 
               (position() &lt; (3 * $prowLimit + 1))"> 
  <xsl:variable name="is-last-table" select="position() - (2*$prowLimit)" />               
  <table>
    <xsl:for-each select=".|following-sibling::Routes[
      not(position() > $prowLimit - 1) or ($is-last-table > 0)]" >
      <tr>
        <td><xsl:value-of select="org" /></td> 
       <td><xsl:value-of select="des" /></td> 
       <td><xsl:value-of select="Flgno" /></td> 
       <td><xsl:value-of select="Via" /></td>
      </tr>
    </xsl:for-each>  
  </table>
 </xsl:if> 
</xsl:template>

</xsl:stylesheet>

XSLT 2.0 解决方案

在 XSLT 2.0 中它变得更容易......

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fn="http://www.w3.org/2005/xpath-functions"
  exclude-result-prefixes="xsl fn">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
 <xsl:variable name="prowLimit" select="floor(count(/*/Routes) div 3)" /> 
 <table>
   <xsl:for-each-group select="*/Routes"
       group-adjacent="fn:min((floor((position() - 1) div $prowLimit),2))" >
     <table>
       <xsl:apply-templates select="current-group()" />
     </table>
   </xsl:for-each-group>
 </table>
</xsl:template>

<xsl:template match="Routes">
      <tr>
       <td><xsl:value-of select="org" /></td> 
       <td><xsl:value-of select="des" /></td> 
       <td><xsl:value-of select="Flgno" /></td> 
       <td><xsl:value-of select="Via" /></td>
      </tr>
</xsl:template>

</xsl:stylesheet>
于 2012-09-04T12:35:42.163 回答