2011-06-28 72 views
2

可用的XSLT是1.0。匹配不同的節點句柄以使用XSLT獲取節點值

我正在基於XML的CMS(Symphony CMS)中使用雙語言網站,並且需要用法語版本替換英文版的類別名稱。

這是我的源XML。

<data> 
    <our-news-categories-for-list-fr> 
     <entry id="118"> 
      <title-fr handle="technology">Technologie</title-fr> 
     </entry> 
     <entry id="117"> 
      <title-fr handle="healthcare">Santé</title-fr> 
     </entry> 
    </our-news-categories-for-list-fr> 
    <our-news-article-fr> 
     <entry id="100"> 
      <categories> 
       <item id="117" handle="healthcare" section-handle="our-news-categories" section-name="Our News categories">Healthcare</item> 
       <item id="118" handle="technology" section-handle="our-news-categories" section-name="Our News categories">Technology</item> 
      </categories> 
      <main-text-fr mode="formatted"><p>Blah blah</p></main-text-fr> 
     </entry> 
    </our-news-article-fr> 
</data> 

這是我目前用於法語版本的XSLT的一部分。

<xsl:template match="data"> 
    <xsl:apply-templates select="our-news-article-fr/entry"/> 
</xsl:template> 

<xsl:template match="our-news-article-fr/entry"> 
    <xsl:if test="categories/item"> 
     <p class="category">In:</p> 
     <ul class="category"> 
      <xsl:for-each select="categories/item"> 
       <li><a href="{/data/params/root}/{/data/params/root-page}/our-news/categorie/{@handle}/"><xsl:value-of select="."/></a></li> 
      </xsl:for-each> 
     </ul> 
    </xsl:if> 
</xsl:template match> 

問題:錨(<xsl:value-of select="."/>)的可見文本給出了類標題的英文版本。

以下節點的句柄匹配(所有的句柄都是英文的),所以我想我應該能夠匹配另一個。

/data/our-news-categories-for-list-fr/entry/title-fr/@handle(標題-FR節點的值是類別標題的法語翻譯)

/data/our-news-article-fr/entry/categories/item/@handle

我是新來的XSLT和我在努力尋找如何做到這一點。

非常感謝。

+0

<標題-FR手柄=」所需的謂語必須使用current()功能針對當前上下文匹配醫療保健「>Santé 不能是有效的標籤? – Mike

+0

@ user639175謝謝 - 更正。 –

+0

+1爲好問題。請參閱我的答案,瞭解如何使用簡單的XPath位置路徑執行此操作。 –

回答

1

添加<xsl:key name="k1" match="our-news-categories-for-list-fr/entry" use="@id"/>作爲XSLT樣式表元素的子元素。然後使用例如<li><a href="{/data/params/root}/{/data/params/root-page}/our-news/categorie/{@handle}/"><xsl:value-of select="key('k1', @id)/title-fr"/></a></li>

1
../our-news-categories-for-list-fr/entry/title-fr/text() instead of @handle should do it 

Your problem is that you are in 
    <our-news-article-fr> 
and need to reference 
    <our-news-categories-for-list-fr> 

,所以我做了父母..走了樹,然後順着入口節點

+0

'our-news-categories-for-list-fr'內有多個'entry'節點 - 我如何基於我所在節點的句柄獲得正確的節點? –

+0

../our-news-categories-for-list-fr/entry/title-fr[@id= current()/ @ id]/text() – Mike

1

xsl:for-each重複指令中,上下文爲our-news-article-fr/entry/categories/item。如果您使用.您選擇當前上下文,那就是您在那裏接收英文版本的原因。

另一種方法(不是說最簡單和最好的方法)就是簡單地指定一個定位正確節點的XPath表達式。您可以使用ancestor::軸從當前上下文退出到data,然後使用您的測試節點。

<xsl:value-of select=" 
    ancestor::data[1]/ 
    our-news-categories-for-list-fr/ 
     entry/ 
     title-fr 
     [@handle=current()/@handle] 
"/> 

如果data是你的文檔的根可以很明顯的使用絕對位置路徑:

/
    data/ 
     our-news-categories-for-list-fr/ 
     entry/ 
     title-fr 
     [@handle=current()/@handle] 
+0

非常感謝 - 非常瞭解。 :) –