2013-08-29 97 views
1

我是XSLT新手,我不確定我是否正在使用正確的措辭來創建我在模板中創建的節點,而不是正在處理的節點。通過「當前模板節點」我的意思是a在此塊:將模板應用到當前模板節點,而不是上下文節點?

<xsl:template match="item"> 
    <li> 
     <a href="{location}"> 
      <xsl:value-of select="title" /> 
     </a> 
    </li> 
</xsl:template> 

我有,我想申請到a另一個模板匹配:

<xsl:template match="a" mode="html"> 
    <a href="{@href}" title="this{@title}"> 
     <xsl:if test="number(substring(@href,1,4)='http')"> 
      <xsl:attribute name="class">external</xsl:attribute> 
      <xsl:attribute name="target">_blank</xsl:attribute> 
     </xsl:if> 
     <xsl:value-of select="." /> 
    </a> 
</xsl:template> 

我的問題是:是否有可能將此a模板應用於我在item模板中創建的a模板,還是僅針對上下文節點進行匹配? (另外,爲了將來的搜索,你稱這種節點是什麼?)

感謝您的閱讀。

編輯:回覆@Jim Garrison詢問我的用例,上面的例子並不遙遠。我必須包括唯一的額外信息是節點集,我有工作,它看起來像:

<related-links> 
    <title>Link text</title> 
    <location>http://link-address.whatever</location> 
</related-links> 

a模板我有用於「外部」類應用,並放置在任何節點我的每一個環節正在處理爲HTML。我想重複使用這個特殊的related-links模板。我能想到現在做的唯一事情是這樣的:

<xsl:template match="item"> 
    <li> 
     <a href="{location}"> 
     <xsl:if test="number(substring(location,1,4)='http')"> 
      <xsl:attribute name="class">external</xsl:attribute> 
      <xsl:attribute name="target">_blank</xsl:attribute> 
     </xsl:if> 
      <xsl:value-of select="title" /> 
     </a> 
    </li> 
</xsl:template> 

這似乎不必要的重複,特別是考慮到這是一開始,我相信它會變得更加複雜。這不是一件不尋常的事情要做...是否有其他方法我應該使用?

P.S. - 我使用的幻彩CMS依賴於這樣的libxslt沒有XSLT 2.0

回答

3

是否有可能將此模板到a我創建的模板item ...?

在沒有擴展名的XSLT 1.0中,no;匹配是並且只能在輸入節點上執行。在具有(相當常見的)節點集()擴展的XSLT 1.0中,是:將a元素或其父li元素分配給變量,從該變量構建節點集,並將模板應用於節點集中的節點該節點集。

在XSLT 2.0中,是:將a元素或其父li元素分配給變量,將模板應用於該變量值中的節點。

請注意,說「這是可能的」和說「這是個好主意」不一樣。可能有其他更簡單,更直接的方式來實現你想要的。特別是,如果您的直接目標是避免重複生成鏈接的幾個位置中的每個鏈接相關代碼,您可以使用命名模板(或者在XSLT 2.0中也是用戶定義的函數)來保存該代碼,並調用模板(或功能)來自需要的地方。任何關於XSLT的好書(最重要的XSLT程序員都是由Michael Kay的書發誓的,但我相信還有其他很好的書)可以幫助您瞭解如何使用命名模板和xsl:call-template指令,定義的功能。

+0

謝謝你幫助我理解。我會嘗試使用命名模板 - 我很猶豫,因爲我讀過的所有內容都說'xsl:call-template'就是PHP程序員試圖使XSLT更像PHP一樣,並且'apply-templates'是正確的XSLT方法。我擴展了我的問題,新信息是否會改變您的答案? –

+0

的確,您希望爲您的大部分控制流程使用xsl:apply-templates。替代方案是在多個模板中複製代碼時,請使用xsl:call-template。 –