一次返回两个XML节点

时间:2013-03-24 17:01:03

标签: xml xpath

我正在尝试获取具有特定属性的兄弟姐妹的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>

3 个答案:

答案 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(), '&#xA;')

产生想要的结果

答案 2 :(得分:0)

由于缺乏对要求的完全理解,但不会有这样的工作吗?

//@qux[../@foo = 'x' or ../@bar='y']
相关问题