给出样本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
,则b
和name="A1"
的某些组合可能不正确,因此我尝试使用一个简单表达式查找它们而不是手动滚动文件。
答案 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>