我有一个看起来像这个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>
</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>
</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>
</xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
它工作正常但是你可以看到我有3个相同的代码块,但每个代码在for-each语句中都有不同的select参数。
我想创建一个变量,我可以存储3个选择参数,并简单地遍历它们,这样我就可以将代码减少到只有1个块。
我尝试过创建变量,但总是失败......
非常感谢任何帮助:)
谢谢!
答案 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,那么到目前为止最简单的解决方案是使用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)。
如果碰巧你不关心迭代顺序(在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,并且上述特殊条件不适用,则使用名为或其他方式的模板和3 xsl:apply-templates作为Tim C的解决方案。 (祝蒂姆第一次正确发帖)。