从 for-each 中的值更改 XPath 查询

发布于 2024-11-10 10:29:54 字数 469 浏览 0 评论 0原文

我正在尝试为每个页面上的每个内容执行一个操作:

<xsl:for-each select="/root/page">
   <xsl:value-of select="/root/titles/@page/"/>
</xsl:for-each>

示例 XML;

<root>
  <titles>
   <en>A title</en>
   <de>Ein Titel</de> 
 </titles>
 <page title="de">
    ....
 </page>
</root>

我遇到的问题是 XPath 未解析为 /root/titles/de/...
我怎样才能让它发挥作用?

I'm trying to do a for each on each page:

<xsl:for-each select="/root/page">
   <xsl:value-of select="/root/titles/@page/"/>
</xsl:for-each>

Sample XML;

<root>
  <titles>
   <en>A title</en>
   <de>Ein Titel</de> 
 </titles>
 <page title="de">
    ....
 </page>
</root>

The problem I am having is that the XPath isn't resolving to the /root/titles/de/...
How can I get it to work?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(4

仙女 2024-11-17 10:29:54

已更新

 <xsl:for-each select="/root/page">
   <xsl:variable name="language" select="@title"/>
   <xsl:value-of select="/root/titles/*[name()=$language]"/>
</xsl:for-each>

现在它对我有用!

updated

 <xsl:for-each select="/root/page">
   <xsl:variable name="language" select="@title"/>
   <xsl:value-of select="/root/titles/*[name()=$language]"/>
</xsl:for-each>

now it works for me!

零時差 2024-11-17 10:29:54

使用xsl:key。因为不清楚您需要的输出,所以我仅提供了一个示例,展示如何根据每个 pagetitles 获取 title到页面语言。


XSLT 1.0Saxon 6.5.5 下测试

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:key name="titles" match="titles/*" use="local-name()"/>

    <xsl:template match="/root">
     <xsl:for-each select="page">
             <xsl:value-of select="concat('title-',@title,key('titles',@title),'
')"/>
     </xsl:for-each>
 </xsl:template>

</xsl:stylesheet>

应用于此输入

 <?xml version="1.0" encoding="UTF-8"?>
<root>
  <titles>
   <en>A title</en>
   <de>Ein Titel</de> 
 </titles>
 <page title="de">
    ....
    </page>
     <page title="en">
    ....
 </page>
</root>

会产生:

title-de:Ein Titel
title-en:A title

在 Mozilla Firefox 3.6.17 上测试如下:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test_trans.xsl"?>
<root>
  <titles>
   <en>A title</en>
   <de>Ein Titel</de> 
 </titles>
 <page title="de">
    ....
    </page>
     <page title="en">
    ....
 </page>
</root>

产生

 title-deEin Titeltitle-enA title

显然没有换行,因为我们将其显示在浏览器和转换应该更改为生成 HTML。

Use xsl:key. Because is not clear the output you need I've provided just an example for you showing how to get the title from titles for each page according to the page language.


XSLT 1.0 tested under Saxon 6.5.5

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:key name="titles" match="titles/*" use="local-name()"/>

    <xsl:template match="/root">
     <xsl:for-each select="page">
             <xsl:value-of select="concat('title-',@title,key('titles',@title),'
')"/>
     </xsl:for-each>
 </xsl:template>

</xsl:stylesheet>

Applied on this input

 <?xml version="1.0" encoding="UTF-8"?>
<root>
  <titles>
   <en>A title</en>
   <de>Ein Titel</de> 
 </titles>
 <page title="de">
    ....
    </page>
     <page title="en">
    ....
 </page>
</root>

produces:

title-de:Ein Titel
title-en:A title

Tested on Mozilla Firefox 3.6.17 as follows:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test_trans.xsl"?>
<root>
  <titles>
   <en>A title</en>
   <de>Ein Titel</de> 
 </titles>
 <page title="de">
    ....
    </page>
     <page title="en">
    ....
 </page>
</root>

Produces

 title-deEin Titeltitle-enA title

Obviously without new lines, because we are displaying it in a browser and the transform should be changed to produce HTML.

依 靠 2024-11-17 10:29:54

目前还不清楚您想要什么,但看起来您应该知道 xsl:for-each 将上下文更改为所选节点,就像模板一样。所以这可能会让你有所收获:

<xsl:for-each select="/root/page">
   <xsl:value-of select="/root/titles/*[name()=current()/@title]"/>
</xsl:for-each>

希望这会有所帮助。

It's not really clear what you want, but it looks like you should be aware that xsl:for-each changes the context to the selected node, just like a template does. So this might get you somewhere:

<xsl:for-each select="/root/page">
   <xsl:value-of select="/root/titles/*[name()=current()/@title]"/>
</xsl:for-each>

Hope this helps.

怎会甘心 2024-11-17 10:29:54
<xsl:for-each select="/root/page">
    <xsl:variable name="language" select="@title"\>
    <xsl:value-of select="/root/titles/$language"/>
</xsl:for-each>
<xsl:for-each select="/root/page">
    <xsl:variable name="language" select="@title"\>
    <xsl:value-of select="/root/titles/$language"/>
</xsl:for-each>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文