xpath:连接兄弟节点文本

时间:2012-03-16 18:41:49

标签: xml xpath

给出样本XML数据:

<root>
  <a>
    <id>1</id>
    <status>on</status>
    <level>4</level>
    <otherData>asdfasdfsdfvasdF</otherData>
    <b>
        <name>A1</name>
    </b>
  </a>
  <a>
    <id>2</id>
    <status>on</status>
    <level>8</level>
    <otherData>asdfasdfsdfvasdF</otherData>
    <b>
        <name>TEST</name>
    </b>
  </a>
  <a>
    <id>3</id>
    <status>off</status>
    <level>2</level>
    <otherData>asdfasdfsdfvasdF</otherData>
    <b>
        <name>A1</name>
    </b>
  </a>
</root>

我想编写一个评估为:

的XPath表达式
1 on
3 off

也就是说,我想提取id节点的文本并将其与status节点连接起来。还有一个附加条件:我只想在name为“A1”的情况下执行此操作。获取id的XPath表达式是:

//name[text()="A1"]/../../id/text()

这是尝试将id与其兄弟status连接起来,这不起作用。

//name[text()="A1"]/../../concat(id/text() , status/text())

我正在尝试做甚么可能吗?如果是这样,那么正确的XPath表达式是什么?


澄清:我没有对这个表达式进行任何转换,我只是将它插入XPath表达式求值程序(例如在Notepad ++或JEdit中 - 通过插件)来帮助调试非常大的XML文件中的细微数据错误。在此示例中,如果id子元素具有status,则bname="A1"的某些组合可能不正确,因此我尝试使用一个简单表达式查找它们而不是手动滚动文件。

2 个答案:

答案 0 :(得分:2)

XPath 2.0:

for $n in /root/a[b/name[.='A1']] return concat($n/id, ' ' , $n/status) 

结果:

1 on
3 off

Oxygen XML Editor中测试,这是一个非常好的工具恕我直言。

答案 1 :(得分:0)

试试这个。您只需添加所需的格式)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:template match="root">
    <xsl:apply-templates select="//name[text()='A1']"></xsl:apply-templates>
  </xsl:template>
  <xsl:template match="name[text()='A1']">
      <xsl:value-of select="../../id"/>
      <xsl:text> </xsl:text>
    <xsl:value-of select="../../status"/>
  </xsl:template>
</xsl:stylesheet>