2013-02-19 67 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。