XSLT 1.0:将条件放入match属性或apply-templates?

时间:2013-02-19 12:51:53

标签: templates xslt apply-templates

我对<xsl:template match=""><xsl:apply-templates/>提出了一般性问题。

我遇到了匹配元素E1EDP01的情况。但是,并非所有E1EDP01元素都匹配,只有一定的范围。

但现在只匹配某一系列元素的正确方法是什么?

这样做是否正确:

<xsl:apply-templates select="E1EDP01"/>

以及限制E1EDP01

范围的模板
<xsl:template match="E1EDP01[not(PSTYV='ZDAE')][E1EDP02[QUALF='001']/ZEILE]">
...
</xsl:template>

或者我是否必须将apply-templates更改为:

<xsl:apply-templates select="E1EDP01[not(PSTYV='ZDAE')][E1EDP02[QUALF='001']/ZEILE]"/>

感谢您对此的意见。

祝你好运, 彼得

2 个答案:

答案 0 :(得分:4)

两者都有效,但它们表达的意图略有不同。具体的匹配模板说“这就是你应该总是处理这种 E1EDP01元素的方式”,<xsl:apply-templates select="E1EDP01"/>说“现在处理所有E1EDP01元素” ”。虽然有一个通用模板和一个特定的应用程序说“我想现在处理这些特定的 E1EDP01元素(但我可能想稍后处理其他元素)”和“这就是你如何处理任何E1EDP01”。

哪种方法更好取决于[not(PSTYV='ZDAE')][E1EDP02[QUALF='001']/ZEILE]是否应该处理元素的方式固有的东西,或者特定于样式表中某个特定位置的特定内容。例如,如果我有一些XML描述金融交易,并且我有一个规则,负数总是必须显示在一个红色框中,那么我可能会定义

<xsl:template match="amount[. &lt; 0]">
  <redbox><xsl:value-of select="."/></redbox>
</xsl:template>
<xsl:template match="amount"><xsl:value-of select="."/></xsl:template>

如果我希望包含一个包含所有负数的摘要红框,但通常在其他地方显示数量,那么我可能会选择使用amount的单个模板,然后在apply-templates处过滤点

<redbox>
  <xsl:apply-templates select="amount[. &lt; 0]" />
</redbox>

您必须选择对您的任务最有意义的方法。

答案 1 :(得分:1)

如果两者都适用于您正在尝试执行的操作,请选择对您的XSLT最有意义的那个。