2011-06-28 5 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ハンドル=」:ドキュメントのルートがある

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

data場合は明らかに絶対ロケーションパスを使用することができます。必要な述語はcurrent()機能を使用して、現在のコンテキストに対して一致している必要がありますヘルスケア ">Santé 有効なタグは使用できません。 – Mike

+0

@ user639175ありがとうございました。 –

+0

+1良い質問です。単純なXPathの場所パスでこれを行う方法を知っている私の答えを参照してください。 –

答えて

1

は、あなたのXSLTスタイルシート要素の子として<xsl:key name="k1" match="our-news-categories-for-list-fr/entry" use="@id"/>を追加します。次に、 <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-new-categories-for-list-fr/entry/title-fr[@id = current()/ @ id]/text() – Mike

1

xsl:for-each繰り返し命令内では、コンテキストはour-news-article-fr/entry/categories/itemです。 .を使用している場合は、現在のコンテキストを選択するため、そこで英語版が届いています。

もう1つのアプローチ(最も簡単で最善の方法ではない)は、正しいノードを特定するXPath式を指定するだけです。 ancestor::軸を使用して現在のコンテキストからdataに移動し、テストノードを使用することができます。

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

ありがとうございます。 :) –

関連する問題