我对<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]"/>
感谢您对此的意见。
祝你好运, 彼得
答案 0 :(得分:4)
两者都有效,但它们表达的意图略有不同。具体的匹配模板说“这就是你应该总是处理这种 E1EDP01
元素的方式”,<xsl:apply-templates select="E1EDP01"/>
说“现在处理所有E1EDP01
元素” ”。虽然有一个通用模板和一个特定的应用程序说“我想现在处理这些特定的 E1EDP01
元素(但我可能想稍后处理其他元素)”和“这就是你如何处理任何E1EDP01
”。
哪种方法更好取决于[not(PSTYV='ZDAE')][E1EDP02[QUALF='001']/ZEILE]
是否应该处理元素的方式固有的东西,或者特定于样式表中某个特定位置的特定内容。例如,如果我有一些XML描述金融交易,并且我有一个规则,负数总是必须显示在一个红色框中,那么我可能会定义
<xsl:template match="amount[. < 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[. < 0]" />
</redbox>
您必须选择对您的任务最有意义的方法。
答案 1 :(得分:1)
如果两者都适用于您正在尝试执行的操作,请选择对您的XSLT最有意义的那个。