2013-10-25 93 views
3

我有這樣的XSLT 2.0模板:XSLT多個條件

<xsl:template match="para[ 
    not(ancestor::p) 
    and not(ancestor::div) 
    and not(ancestor::paragraph) 
    ]"> 
    <p class="para"> 
     <xsl:apply-templates/> 
    </p> 
</xsl:template> 

它做什麼,我需要做的:它阻止一個HTML <p><p>。但它是冗長的,我想有一個更簡潔的方式來寫它。

有沒有更好的方式來寫多祖先測試?我嘗試了一個聯盟..當然這並不奏效。

回答

2
<xsl:template match="para[not(ancestor::p|ancestor::div|ancestor::paragraph)]"> 
    <p class="para"> 
     <xsl:apply-templates/> 
    </p> 
</xsl:template> 

備選地

<xsl:template match="para"> 
    <p class="para"> 
     <xsl:apply-templates/> 
    </p> 
</xsl:template> 

<xsl:template match="para[ancestor::p|ancestor::div|ancestor::paragraph]" /> 
<!-- or whatever you want to do in that case, <xsl:apply-templates/> maybe --> 
+1

1。在第二種情況下,這將有助於解釋,第二個模板由於其匹配模式的特殊性更高的優先級含蓄。然而,這引入了隱藏的依賴關係,以後可能很容易被打破,例如如果某人由於某種原因需要更改'match =「para」'模式。我在使用模板優先級時的建議是使用'priority ='屬性使它們顯式化。 – LarsH

+0

@LarsH我已經得到了一個有點疲憊解釋比賽表達特異性的,但是,是的,你說得對。還有第二點,這是任何黑名單/白名單固有的問題。達到一定的轉換複雜度時,它仍然可以管理,在某些時候它可能會導致意外的行爲。 – Tomalak

+0

我同意你的意見。除了複雜性,也取決於人們對項目的數量,他們在XSLT的經驗水平等。我不會告訴專家做一個個人項目,他應該避免使用隱式的優先級。但我認爲引入依賴於它,別人誰可能不知道的解決方案時,重要的是,他們知道這個問題的存在。然後他們可以做出明智的決定。是什麼讓這種情況下,值得格外注意的是,如果發生錯誤,這是非常難以發現爲什麼,如果你不知道的默認優先級機制。 – LarsH