0

我有一个看起来像这样的 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 语句中都有不同的选择参数。

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

我试过创建一个变量,但它总是失败......

任何帮助深表感谢 :)

谢谢!

4

2 回答 2

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 的使用。

于 2012-07-09T08:00:33.613 回答
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>

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

条件 XSLT 1.0 解决方案

如果碰巧您不关心迭代顺序(DubieuzeDebiteurenApp 在 VoorzieningenApp 之前),或者您的问题中的顺序已经是文档顺序,那么 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 的解决方案。(恭喜蒂姆第一个正确的帖子)。

于 2012-07-09T08:53:29.550 回答