XPath:如何选择属性值等于另一个元素值的元素

时间:2014-11-09 14:05:24

标签: xml xslt xpath

我有以下xml并尝试查找其中的所有链接关系: (xml片段)

<heading nodeid="LINK_installing_driver">Installing the driver</heading>
...
<link linktotargetid="LINK_installing_driver">Installing the driver</link>

我不能只比较属性值字符串,因为我不确定它们。所以我需要一个通用的XPath表达式。我想要标题的文本,其nodeid与相应的链接元素匹配。

我尝试了以下内容:

<xsl:value-of select="heading[@nodeid = //link/@linktotargetid]"/>

2 个答案:

答案 0 :(得分:1)

您能否提供有关问题发生位置的更多信息?你的XPath看起来是正确的,我刚刚用XSLT

创建了一个example
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" doctype-public="XSLT-compat" 
              omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match="@*|node()">
   <xsl:value-of select="heading[@nodeid = //link/@linktotargetid]"/>
</xsl:template>
</xsl:stylesheet>  

和示例输入XML

<root>
  <heading nodeid="LINK_installing_driver">Installing the driver</heading>
   <link linktotargetid="LINK_installing_not_driver">Not Installing the driver</link>
   <link linktotargetid="LINK_installing_driver">Installing the driver</link>
</root>

显示正确的标题:Installing the driver

答案 1 :(得分:1)

你的问题缺乏背景。通常,最好使用从XML文档的另一个分支中查找数据。

例如,如果您在样式表的顶层定义以下键:

<xsl:key name="head" match="heading" use="@nodeid" />

然后您可以在link的上下文中使用它来检索相应heading的值,例如

<xsl:template match="link">
    ...
        <xsl:value-of select="key('head', @linktotargetid)" />
    ...
</xsl:template>