使用 XSLT 匹配不同的节点句柄来获取节点值
可用的 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>
问题:锚点的可见文本 (
) 给出了类别标题的英文版本。
以下节点的句柄匹配(所有句柄均为英文),因此我认为我应该能够将其中一个与另一个进行匹配。
/data/our-news-categories-for-list-fr/entry/title-fr/@handle
(title-fr 节点的值是类别标题的法语翻译)
/data/ our-news-article-fr/entry/categories/item/@handle
我是 XSLT 新手,正在努力寻找如何做到这一点。
非常感谢。
XSLT available is 1.0.
I'm working on a dual-language site in an XML-based CMS (Symphony CMS), and need to replace the English version of a category name with the French version.
This is my source 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>
This is part of the XSLT that I currently have for the French version.
<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>
The problem: the visible text of the anchor (<xsl:value-of select="."/>
) gives the English version of the category title.
The handles of the following nodes match (all handles are in English), and so I'm thinking I should be able to match one from the other.
/data/our-news-categories-for-list-fr/entry/title-fr/@handle
(value of title-fr node is French translation of category title)
/data/our-news-article-fr/entry/categories/item/@handle
I'm new to XSLT and am struggling to find how to do this.
Many thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
添加
作为 XSLT 的子项样式表元素。然后使用例如。
Add
<xsl:key name="k1" match="our-news-categories-for-list-fr/entry" use="@id"/>
as a child of your XSLT stylesheet element. Then use e.g.<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>
.所以我做一个父级..沿着树向上走,然后沿着入口节点向下走
so I do a parent .. to walk up the tree and then down the entry nodes
在
xsl:for-each
重复指令中,上下文是our-news-article-fr/entry/categories/item
。如果您使用.
您选择当前上下文,这就是您在那里收到英文版本的原因。另一种方法(不是说最简单和最好的方法)是简单地指定一个定位正确节点的 XPath 表达式。您可以使用
ancestor::
轴从当前上下文转到data
,然后使用您的测试节点。所需的谓词必须使用current()
函数与当前上下文匹配:如果
data
是文档的根,则显然可以使用绝对位置路径:Within the
xsl:for-each
repetition instruction, the context isour-news-article-fr/entry/categories/item
. If you use.
you select the current context, that's why you are receiving the english version there.Another approach (not saying the simplest and the best one) is simply specify an XPath expression which locates the correct node. You can use the
ancestor::
axis to go out from the current context todata
and then use your test node. The needed predicate must match against the current context usingcurrent()
function:If
data
is the root of your document you can obviously use an absolute location path: