匹配不同的节点句柄以使用XSLT获取节点值

时间:2011-06-28 15:30:53

标签: xslt matching xslt-1.0 symphony-cms

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节点的值是类别标题的法语翻译)

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

我是XSLT的新手,我正在努力寻找如何做到这一点。

非常感谢。

3 个答案:

答案 0 :(得分: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>

所以我做父母..走上树然后沿着入口节点

答案 1 :(得分: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>

答案 2 :(得分: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]