所以这是我的问题......
我有2个xsl转换,它们都有xsl:for-each作为起点。
我需要创建一个(主)xslt来调用它们。但当然,有一个问题。
这个新的xslt应该从第一个xslt输出一个节点,然后从第二个节点输出一个节点。(两个xslt都有EmployeeId,但基本上是不同的报告,必须一个接一个地打印)。
因为这些现有的xslt包含for-each,当我将它们包含在这个主xslt中时,我得到一个输出:来自第一个xslt的所有节点,然后来自第二个的所有节点。
此2 xslt也必须向后兼容,因此如果不从此主模板调用它们,它们应该像以前一样工作。
我是xslt的首发,当我只使用一个xslt时,我设法创建了一些报告,但我似乎找不到解决这个问题的方法,所以我感谢所有帮助。/ p>
我正在考虑创建一个新的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导入。
答案 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>