2013-02-19 54 views
1

我有一个关于<xsl:template match=""><xsl:apply-templates/>的一般性问题。XSLT 1.0:将条件放入匹配属性或apply-templates?

我有,我的元素E1EDP01匹配的情况。但是并不是所有的E1EDP01元素都应该匹配,只有一定的范围。

但现在是什么只匹配一定范围的元素的正确方法是什么?

它是正确的做这样:

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

和模板限制的E1EDP01范围:

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

还是我必须改变应用模板到:

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

感谢您对此提出意见。

最好的问候, 彼得

回答

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> 

相反,如果我想有一个总结的Redbox所有的负数金额,但显示的金额通常在其他地方那么我可能会选择使用一个单一的模板amount但随后在apply-templates

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

你必须选择最有意义的执行任务的方式筛选。

+0

你好伊恩,谢谢你的详细解答。是的,他们都工作。由于性能问题,我想知道是否也可以选择?不过,我不太明白你在第二段中的意思。我针对符合条件的所有E1EDP02元素进行了特定操作,其他所有元素均未考虑。你能再解释第二段吗?谢谢彼得PS:例如从Dimitre下面的评论:http://stackoverflow.com/questions/12404116/nested-loops-in-xslt-for-dynamically-building-xml/12405591#12405591不使用/ /在比赛模式中。 – Peter 2013-02-19 13:51:12

+0

你好伊恩,谢谢你的修改。我想我会在中进行过滤,因为我特别只想要处理某个范围(在您的示例中为)。我想我明白了。最好的问候,彼得+1 – Peter 2013-02-20 20:47:07

1

如果你想要做什么都工作,随便挑一个,使最适合您的XSLT。