一个xslt来统治它们

时间:2011-01-11 22:37:02

标签: xslt

所以这是我的问题......

我有2个xsl转换,它们都有xsl:for-each作为起点。

我需要创建一个(主)xslt来调用它们。但当然,有一个问题。

这个新的xslt应该从第一个xslt输出一个节点,然后从第二个节点输出一个节点。(两个xslt都有EmployeeId,但基本上是不同的报告,必须一个接一个地打印)。

因为这些现有的xslt包含for-each,当我将它们包含在这个主xslt中时,我得到一个输出:来自第一个xslt的所有节点,然后来自第二个的所有节点。

此2 xslt也必须向后兼容,因此如果不从此主模板调用它们,它们应该像以前一样工作。

我是xslt的首发,当我只使用一个xslt时,我设法创建了一些报告,但我似乎找不到解决这个问题的方法,所以我感谢所有帮助。

我正在考虑创建一个新的xslt,它可以是我拥有的两个xslt,但是我的老板已经排除了这个。

谢谢, Benxy

编辑:

以下是一些要求的例子:

这是第一个xslt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0" encoding="windows-1250" indent="yes" omit-xml-declaration="yes" />
<xsl:template match="/" name="testXslt1">
    <xsl:for-each select="a">   
        <table>
            <tr>
                <td>
                    <xsl:value-of select="@SomeData"></xsl:value-of>
                </td>
                etc.            
            </tr>
            <xsl:apply-templates select="b" mode="tmp"/> 
        </table>
    </xsl:for-each>
</xsl:template>

<xsl:template match="node()" mode="tmp">
    <tr >
        <td><xsl:value-of select="@SomeOtherData"></xsl:value-of></td>
        etc.
    </tr>
</xsl:template>

第二个xslt与第一个类似。

在Master xslt中,我会导入它们并为每个调用模板testXslt1和testXslt2导入。

1 个答案:

答案 0 :(得分:0)

  

这个新的xslt应该输出一个   第一个xslt的节点,然后是一个节点   从第二个

以下是一个如何完成此操作的简单示例

此转换结合了在XML文档上应用的两个模板的结果。

第一个模板产生的值是每个/*/*节点的两倍。第二个转换生成每个/*/*节点的值的平方。将两个remplate应用于XML文档的结果根据需要交替混合在一起,这是最终结果:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
 >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:variable name="vrtfResults1">
    <xsl:apply-templates select="/"
         mode="transform1"/>
  </xsl:variable>
  <xsl:variable name="vrtfResults2">
    <xsl:apply-templates select="/"
         mode="transform2"/>
  </xsl:variable>

  <xsl:variable name="vResults1"
   select="ext:node-set($vrtfResults1)/node()"/>

  <xsl:variable name="vResults2"
   select="ext:node-set($vrtfResults2)/node()"/>

   <xsl:for-each select="$vResults1">
     <xsl:variable name="vPos" select="position()"/>

     <xsl:copy-of select=".|$vResults2[$vPos]"/>
   </xsl:for-each>

   <xsl:if test=
     "count($vResults2) > count($vResults2)">
     <xsl:copy-of select=
      "$vResults2[position()>count($vResults1)]"/>
   </xsl:if>
 </xsl:template>

 <xsl:template match="/" mode="transform1">
   <xsl:for-each select="/*/*">
    <xsl:copy>
     <xsl:value-of select=".+."/>
    </xsl:copy>
   </xsl:for-each>
 </xsl:template>

 <xsl:template match="/" mode="transform2">
   <xsl:for-each select="/*/*">
    <xsl:copy>
     <xsl:value-of select=".*."/>
    </xsl:copy>
   </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

对此XML文档应用此转换时

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

产生了想要的正确结果

<num>2</num>
<num>1</num>
<num>4</num>
<num>4</num>
<num>6</num>
<num>9</num>
<num>8</num>
<num>16</num>
<num>10</num>
<num>25</num>
<num>12</num>
<num>36</num>
<num>14</num>
<num>49</num>
<num>16</num>
<num>64</num>
<num>18</num>
<num>81</num>
<num>20</num>
<num>100</num>