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

发布于 2024-11-17 16:29:34 字数 2168 浏览 3 评论 0原文

可用的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

好菇凉咱不稀罕他 2024-11-24 16:29:34

添加 作为 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>.

    神妖 2024-11-24 16:29:34
    ../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>
    

    所以我做一个父级..沿着树向上走,然后沿着入口节点向下走

    ../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>
    

    so I do a parent .. to walk up the tree and then down the entry nodes

    黯然#的苍凉 2024-11-24 16:29:34

    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]
    

    Within the xsl:for-each repetition instruction, the context is our-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 to data and then use your test node. The needed predicate must match against the current context using current() function:

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

    If data is the root of your document you can obviously use an absolute location path:

         /
         data/
          our-news-categories-for-list-fr/
           entry/
            title-fr
            [@handle=current()/@handle]
    
    ~没有更多了~
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文