2

使用可能なXSLTは1.0です。

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(title-frノードの値はカテゴリtitleのフランス語訳です)

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

私はXSLTを初めて使用し、これを行う方法を見つけるのに苦労しています。

どうもありがとう。

4

3 に答える 3

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>

だから私は親をします..ツリーを上ってからエントリーノードを下って行きます

于 2011-06-28T15:50:56.363 に答える
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>

于 2011-06-28T15:53:17.503 に答える
1

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

別のアプローチ(最も単純で最良のアプローチとは言えません)は、正しいノードを見つけるXPath式を指定するだけです。ancestor::軸を使用して、現在のコンテキストからテストノードに移動してからdataテストノードを使用できます。必要な述語は、current()関数を使用して現在のコンテキストと一致する必要があります。

<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]
于 2011-06-29T05:51:29.457 に答える