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
(标题fr节点的值为类别标题的法语翻译)
/data/our-news-article-fr/entry/categories/item/@handle
我是XSLT的新手,正在努力寻找如何做到这一点。
非常感谢。
添加<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>
。
../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>
所以我做了一个家长。。向上遍历树,然后向下遍历入口节点
在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]