2017-02-17 63 views
0

XSL:XSLT 1.0:僅匹配基於優先級的兩個模板之一

<xsl:template match="/"> 
    <xsl:apply-templates select="*[local-name(.)='root']/*[local-name(.)='child1']" /> 
    <xsl:apply-templates select="*[local-name(.)='root']/*[local-name(.)='child2']/*[local-name()='anotherchild1']" /> 
</xsl:template> 

<xsl:template match="*[local-name(.)='child1']"> 
    <!-- do something in template1 !--> 
</xsl:template> 

<xsl:template match="*[local-name(.)='anotherchild1']" priority="0"> 
    <!-- do something in template2 !--> 
</xsl:template> 

實施例:

<a:root> 
    <b:child1> 
    <d:grandchildOfChild1> 
    </d:grandchildOfChild1> 
    </b:child1> 
    <c:child2> 
    <d:anotherchild1> 
     <d:grandchildOfAnotherChild1> 
     </d:grandchildOfAnotherChild1> 
    </d:anotherchild1> 
    </c:child2> 
</a:root> 

要求:

  • 如果只有 'child1' 存在,我想用'grandchildOfChild1'做點什麼
  • 如果只有'anotherchild1'存在,我會如果'child1'&'anotherchild1'存在,我只需要'child1'模板優先使用'grandchildOfChild1'來做某件事。

上面的XSL爲我提供了#1,#2的預期結果,但是如果兩者都存在,那麼兩個模板都會匹配,並且兩個結果都會呈現。我如何使它只取第一個?

+0

對我來說這個問題根本不清楚。我可以看到你輸入的所有元素,但你的解釋是有條件的。你能改說一下嗎? –

+1

我想在嘗試解決這個問題之前要做的事情是學習如何正確使用名稱空間。這裏有幾十個關於如何做到這一點的答案。我也同意你的問題完全不清楚。請向我們展示一個真實世界的例子和期望的輸出。 – JLRishe

回答

0

如果只有「child1」是存在的,我想要做的事與 「grandchildOfChild1」

這裏的模板匹配grandchildOfChild1的例子,只有當它的父child1沒有兄弟姐妹:

<xsl:template match="child1[count(../*) = 1]/grandchildOfChild1"> 
    <!-- do something with 'grandchildOfChild1' --> 
</xsl:template> 

您可以爲第二個要求做同樣的事情。


如果 'child1' & 'anotherchild1' 都存在,我想只有 'child1' 模板佔先,做一些與 'grandchildOfChild1'。

這部分內容不清楚。我認爲你想有另一個模板:

<xsl:template match="grandchildOfChild1"> 
    <!-- do something else with 'grandchildOfChild1' --> 
</xsl:template> 

這會踢成的動作,當上面的更具體的模板是不適用的。

+0

謝謝!我的#3要求是隻在第一個模板上匹配,當這兩個元素出現在傳入的XML文檔中時。例如,如果'child1'和'anotherchild1'存在,我希望匹配'child1'的模板優先並且只匹配。匹配'anotherchld1'的模板應該被忽略。希望這是明確的。 – Preethi

+0

不,我恐怕根本不清楚。你可以有幾個匹配'child1'的模板,並指定確定哪個模板在什麼時候應用的條件。你不能有一個匹配'child1'的模板覆蓋匹配'anotherchild1'的模板。 –