Xml xpath:连接同级节点文本

Xml xpath:连接同级节点文本,xml,xpath,Xml,Xpath,给定示例XML数据: <root> <a> <id>1</id> <status>on</status> <level>4</level> <otherData>asdfasdfsdfvasdF</otherData> <b> <name>A1</name> </b&g

给定示例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>
这里尝试将
id
与它的同级
状态
连接起来,但这不起作用

//name[text()="A1"]/../../concat(id/text() , status/text())
我想做的事可能吗?如果是这样,正确的XPath表达式是什么



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

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


XPath 2.0:

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

1 on
3 off

在中测试,这是一个非常好的工具IMHO。

对不起,我应该说得更清楚:我不是在样式表中这样做的,我用它来调试有细微数据错误的大型XML文件。嗯。。。我用于Notepad++的插件似乎不支持XPath 2.0,JEdit插件也不支持(它们都给了我“非法令牌”类型的错误)。您可以推荐哪些好的工具/编辑器来评估这一点?如果可能的话,也可以在Xpath 1.x中实现这一点。Oxygen看起来是一个非常灵活的工具,但我不需要它的大部分功能,而且我认为我无法获得这些许可证的预算。这正是我在工作站上调试和更正XML文件所需要的,直到几周后修复程序投入生产。我还没有测试过这个插件,它使用的是旧版本的Saxon(Saxon 7),但它可能还是有用的。啊哈,我让它工作了,但我必须安装Saxon插件来支持XPath 2.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>
for $n in /root/a[b/name[.='A1']] return concat($n/id, ' ' , $n/status) 
1 on
3 off