2011-01-11 63 views
2

因此,这里是我的问题...一个XSLT来统治他们

我有2个XSL转换,他们都具有的xsl:for-每个它们为出发点。

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

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

因为这些现有XSLT的有,各在其中,当我将它们包含在这个主XSLT我得到的输出:从第一XSLT的所有节点,然后从第二个所有节点。

而且这2周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是相似到第一个。

在主XSLT我会在每次调用模板testXslt1和testXslt2导入他们与英寸

+3

你需要更清晰用你的语言。我怀疑你使用“xslt”作为xsl:template的同义词 - 事实并非如此。 XSLT是一种语言。有XSLT文件,可以阅读你的文章作为指向两个单独的xslt文件,但我不这么认为。你可以给一个简单的代码块(不超过20行)给出一个问题的概念 - 散文不是一个很好的解释方式 – 2011-01-11 22:44:49

回答

0

这个新XSLT应该给输出第一XSLT一个 节点,从第二

然后一个节点 举个简单的例子,如何可以做到这一点

这转换结合了应用于XML文档的两个模板的结果。

第一模板产生每/*/*节点的值的两倍。第二次转换产生每个/*/*节点的值的平方。施加所述两个remplates上的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> 
相关问题