2010-03-10 61 views
1

我最初關於apply-imports的想法是,如果有兩個模板匹配同一個節點,那麼使用具有更高優先級的模板中的apply-imports將運行具有較低優先級的模板。但我最近發現,如何組織進口是非常重要的。xsl apply-imports的範圍是什麼?

兩個案例特別感興趣。

  • 將應用導入工作導入導入文件(嵌套導入)的模板?
  • 怎麼樣「兄弟進口」(主文件導入兩個文件匹配相同的節點模板)

在我看來,這是沒有明確specification描述。有人能提供權威的指導方針嗎?

編輯:我可以嘗試自己的情況下,但總是有一個危險,它將是實現特定的行爲。

回答

1

我不是一個XSLT專家(更多的是一個愛好者),但這是一個有趣的,迄今尚未回答的問題。我認爲答案確實存在於規範中,但有點令人困惑,因爲您需要確定先後的順序遍歷。

http://en.wikipedia.org/wiki/Tree_traversal

有處於 「導入優先級」 樹的說明書中的示例:

http://www.w3.org/TR/xslt#dt-import-precedence

例如,假設

  • 樣式表A導入的樣式表乙和C按順序;
  • 樣式表B輸入樣式表D;
  • 樣式Ç進口樣式E.

然後導入優先 (由低到高)的順序爲d,B,E,C,A

你需要欣賞後序遍歷,以便您可以理解樣式表爲何具有此導入優先順序。 wikipedia將後序遍歷定義爲「左,右,根」。

通常,具有較高導入優先級的定義或模板規則優先於具有較低導入優先級的定義或模板規則。

所以回到你的具體問題:

  • 將適用的進口在其上進口文件(嵌套進口)進口模板工作?

我的猜測是肯定的(根據優先順序),它甚至會調用多個模板,如果你從相應的匹配模板中調用它們。如下所述:

http://www.w3.org/TR/xslt#element-apply-imports

例如,假設樣式表 doc.xsl包含 例如元素模板規則:

<xsl:template match="example"> 
    <pre><xsl:apply-templates/></pre> 
</xsl:template> 

另一個樣式表可以導入 doc.xsl和修改處理 示例元素如下:

<xsl:import href="doc.xsl"/> 

<xsl:template match="example"> 
    <div style="border: solid red"> 
    <xsl:apply-imports/> 
    </div> 
</xsl:template> 

的組合效果將是 變換的示例爲元素形式的 :

<div style="border: solid red"><pre>...</pre></div> 
  • 怎麼樣「同級導入」(主文件導入兩個文件模板匹配相同的節點)

根據具有較高導入優先級的匹配模板進行選擇,這由導入順序決定。

我的猜測是它的工作是這樣的:

  • 一個樣式表的順序進口樣式B和C;

然後導入優先級的順序(第一最低)是B,C,A。

因此,在這種情況下,樣式表中℃的模板將被選擇。

  • stylesheet A依次導入樣式表C和B;

然後導入優先級的順序(第一最低)是C,B,A。

因此,在這種情況下,樣式表中B中的模板將被選擇。

+0

我認爲你在寫作的一切中都是絕對正確的。然而,您更關心優先級而不是整體可用性。例如嵌套導入大多工作。但沒有人明確表示。這很重要,因爲我期望兄弟導入的行爲相同,但它大多不起作用。根據你的例子給出一個例子:如果你在B中調用apply-imports,它不會(主要)調用C中定義的模板,儘管它與節點匹配!我必須找出一些時間來嘗試將你的答案應用於我的情況,我現在太忙了。 – 2010-03-23 13:58:44