循环变量值

时间:2012-07-09 07:11:12

标签: xml xslt

我有一个看起来像这个atm的XSLT:

<xsl:template match="Root">           
<xsl:for-each select="Worksheettype[@name='DubieuzeDebiteurenApp']">
  <xsl:for-each select="Types/Sub/*">        
    <xsl:for-each select="./*">
      <xsl:value-of select="ancestor::Worksheettype/@TypeId"/> ; <xsl:value-of select="local-name(parent::*)"/> ; <xsl:value-of select="local-name()"/>
      <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>        
  </xsl:for-each>
</xsl:for-each>

<xsl:for-each select="Worksheettype[@name='VoorzieningenApp']">
  <xsl:for-each select="Types/Sub/*">
    <xsl:for-each select="./*">
      <xsl:value-of select="ancestor::Worksheettype/@TypeId"/> ; <xsl:value-of select="local-name(parent::*)"/> ; <xsl:value-of select="local-name()"/>
      <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>
  </xsl:for-each>
</xsl:for-each>


<xsl:for-each select="Worksheettype[@name='RisicoKapitaalApp']">
  <xsl:for-each select="Types/Sub/*">
    <xsl:for-each select="./*">
      <xsl:value-of select="ancestor::Worksheettype/@TypeId"/> ; <xsl:value-of select="local-name(parent::*)"/> ; <xsl:value-of select="local-name()"/>
      <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>
  </xsl:for-each>
</xsl:for-each>
</xsl:template>

它工作正常但是你可以看到我有3个相同的代码块,但每个代码在for-each语句中都有不同的select参数。

我想创建一个变量,我可以存储3个选择参数,并简单地遍历它们,这样我就可以将代码减少到只有1个块。

我尝试过创建变量,但总是失败......

非常感谢任何帮助:)

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以在此处使用命名模板,只需将工作表名称作为参数传递

即可
<xsl:template name="Worksheettype">
   <xsl:param name="typeName" />
   <xsl:for-each select="Worksheettype[@name=$typeName]"> 
        <!-- Remaining code -->
   </xsl:for-each>
</xsl:template>

然后你会这样称呼它

<xsl:call-template name="Worksheettype">
   <xsl:with-param name="typeName" select="'DubieuzeDebiteurenApp'" />
</xsl:call-template>

<xsl:call-template name="Worksheettype">
   <xsl:with-param name="typeName" select="'VoorzieningenApp'" />
</xsl:call-template>

<xsl:call-template name="Worksheettype">
   <xsl:with-param name="typeName" select="'RisicoKapitaalApp'" />
</xsl:call-template>

另一种方法是使用模板匹配。首先创建一个与Worksheettype匹配的模板,如此

<xsl:template match="Worksheettype">
    <xsl:for-each select="Types/Sub/*">
        <!-- Remaining code -->
    </xsl:for-each>
</xsl:template>

然后,您将为每个属性类型

应用相关模板
<xsl:apply-templates select="Worksheettype[@type='DubieuzeDebiteurenApp']" />

<xsl:apply-templates select="Worksheettype[@type='VoorzieningenApp']" />

<xsl:apply-templates select="Worksheettype[@type='RisicoKapitaalApp']" />

这种方法可能更符合XSLT的精神,并且会删除使用一个xsl:for-each。

答案 1 :(得分:1)

Fbo,您尚未指定您所使用的XSLT版本。

XSLT 2.0解决方案

如果你可以使用XSLT 2.0,那么到目前为止最简单的解决方案是使用XPATH逗号(,)运算符,它看起来像这样......

<xsl:for-each select="Worksheettype[@name='DubieuzeDebiteurenApp'],
                      Worksheettype[@name='VoorzieningenApp'],
                      Worksheettype[@name='RisicoKapitaalApp']">
  <xsl:for-each select="Types/Sub/*">        
    <xsl:for-each select="./*">
      ... banana banana banana etc.       
  </xsl:for-each>
</xsl:for-each>

逗号运算符保留显示的迭代顺序(在VoorzieningenApp之前的DubieuzeDebiteurenApp)。

条件XSLT 1.0解决方案

如果碰巧你不关心迭代顺序(在VoorzieningenApp之前的DubieuzeDebiteurenApp),或者你的问题中的顺序已经按文档顺序排列,那么XSLT 1.0中最简单的解决方案将是这样的。

<xsl:for-each select="Worksheettype[ (@name='DubieuzeDebiteurenApp') or
                                     (@name='VoorzieningenApp')
                                     (@name='RisicoKapitaalApp')]">

......或等效于XSLT 2.0 ......

<xsl:for-each select="Worksheettype[ @name in
    ('DubieuzeDebiteurenApp','VoorzieningenApp','RisicoKapitaalApp')]">

后备XSLT 1.0解决方案

如果您遇到XSLT 1.0,并且上述特殊条件不适用,则使用名为或其他方式的模板和3 xsl:apply-templates作为Tim C的解决方案。 (祝蒂姆第一次正确发帖)。