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

时间:2011-05-31 03:24:18

标签: xml xslt xpath

我正在尝试为每个页面上的每一个做一个:

<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/... 我怎样才能让它发挥作用?

4 个答案:

答案 0 :(得分:1)

<强>更新

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

现在它适合我!

答案 1 :(得分:1)

您想要的并不是很清楚,但看起来您应该知道xsl:for-each将上下文更改为所选节点,就像模板一样。所以这可能会让你到达某个地方:

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

希望这有帮助。

答案 2 :(得分:1)

使用xsl:key。由于不清楚您需要的输出,我只提供了一个示例,说明如何根据页面语言为每个title titles获取page


Saxon 6.5.5 下测试

XSLT 1.0

<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),'&#xA;')"/>
     </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。

答案 3 :(得分:0)

<xsl:for-each select="/root/page">
    <xsl:variable name="language" select="@title"\>
    <xsl:value-of select="/root/titles/$language"/>
</xsl:for-each>