我正在尝试获取具有特定属性的兄弟姐妹的qux
属性列表,在本例中属性x
中的foo
和属性{{1中的y
它是兄弟姐妹。
foo
这会创建一个列表,但与分别运行这两个部分并将它们添加到一起(订单除外)相同。我需要一个旁边的//node[@foo="x" and following-sibling::node[@foo="y"]]/@qux | //node[@foo="y" and preceding-sibling::node[@foo="x"]]/@qux
列表,所以每行列出两个qux
个元素,显然是兄弟姐妹在哪里匹配。
这可以在xpath中完成,如果是这样,怎么做?如果没有,xquery会做这个工作吗?
编辑:示例文件和输出:
qux
请注意,我感兴趣的节点的深度是未知的,因此(我认为)//节点的使用是必要的。
查询应返回:
<database>
<ds version="1">
<node>
<node foo="x" qux="hello"/>
<node foo="y" qux="world"/>
</node>
</ds>
<ds version="1">
<node>
<node>
<node foo="x" qux="another"/>
<node foo="y" qux="sentence"/>
<node foo="y" qux="example"/>
<node foo="z" qux="irrelevant"/>
</node>
</node>
</ds>
<ds version="1">
<node>
<node foo="y" qux="not"/>
<node foo="z" qux="returned"/>
</node>
</ds>
</database>
答案 0 :(得分:1)
使用单个XPATH语句获取结果并不容易 - XPATH真正用于XML导航。 XSL用于XML转换(这正是你想要做的,即将属性列表[hello] [world]转换为字符串“hello world”。)这里是你需要得到你想要的结果的XSL -
<?xml version="1.0" encoding="UTF-8"?>
<?altova_samplexml file:///C:/Users/Damien/Desktop/testXML.xml?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-
functions">
<xsl:template match="/">
<xsl:for-each select="//node[@foo='x' and following-
sibling::node[@foo='y']]/@qux | //node[@foo='y' and preceding-
sibling::node[@foo='x']]/@qux">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
根据OP对XPath 2.0解决方案的兴趣:
此XPath 2.0表达式:
for $n in //node[@foo eq 'x' and following-sibling::*[1][self::node[@foo eq 'y']]]
return
( ($n|$n/following-sibling::*[1])/@qux/string(), '
')
产生想要的结果。
答案 2 :(得分:0)
由于缺乏对要求的完全理解,但不会有这样的工作吗?
//@qux[../@foo = 'x' or ../@bar='y']