2010-11-03 34 views
0

给出下面,我想提取VarVal1,VarVa5和VarText其中FixedVals是,好,固定:)使用XPath获得复杂的值

<TypeA Attr1="VarVal1"> 
    <TypeB Attr2="FixedVal2"> 
     <TypeC Attr3="FixedVal3"> 
      <TypeD Attr4="FixedVal4" Attr5="VarVal5"> 
       VarText 
      </TypeD> 
     </TypeC> 
    </TypeB> 
</TypeA> 

注意,对我来说最大的问题是,上下文很重要。我想要完整的模式。可能还有其他类型A节点,但我不感兴趣,他们的价值,除非他们随后

<TypeB Attr2="FixedVal2"> 
     <TypeC Attr3="FixedVal3"> 
      <TypeD Attr4="FixedVal4" Attr5="VarVal5"> 
       VarText 
      </TypeD> 
     </TypeC> 
    </TypeB> 

换句话说,我很感兴趣的是一组tripletts的,他们每个人在(VarVal1,VarVal5,VarText)

+0

我错过了指定TypeA可能出现在文本的其他位置,我只对TypeB,TypeC和TypeD具有特定固定值的实例感兴趣。我会编辑。 – Avi 2010-11-03 19:50:13

+0

这是否意味着没有任何'TypeA'元素,但是包含'TypeB','TypeC'等的元素? – 2010-11-03 19:54:44

+0

@Ajjandro:是的,可能有很多TypeA元素,但我只对那些包含TypeB,TypeC等的元素感兴趣。 – Avi 2010-11-03 20:03:18

回答

2

这些XPath表达式:

//TypeA 
[TypeB[@Attr2="FixedVal2"] 
    /TypeC[@Attr3="FixedVal3"] 
    /TypeD[@Attr4="FixedVal4"]] 
/@Attr1 

那么那些已经发布:

//TypeA 
/TypeB[@Attr2="FixedVal2"] 
    /TypeC[@Attr3="FixedVal3"] 
    /TypeD[@Attr4="FixedVal4"] 
    /@Attr5 

而且

//TypeA 
/TypeB[@Attr2="FixedVal2"] 
    /TypeC[@Attr3="FixedVal3"] 
    /TypeD[@Attr4="FixedVal4"] 

你也可以用|工会集合运算符将它们组合。但根据主机语言的不同,您应该更好地选择您想要的TypeA元素(第一个表达式的末尾为/@Attr1部分),然后查询每个元素以提取剩余的值。

+0

我想我明白了。每个表达式都返回一个带有N个值的列表(即ValVar1A,ValVar1B,... ValVar1Z,然后是ValVar5A,ValVar5B,... ValVar5Z后面跟着VarTextA,VarTextB ... VarTextZ和我必须结合第n个每个元素都包含第n个三元组? – Avi 2010-11-03 22:45:45

+0

@Avi:是的,你说的对!使用'|'联合集合运算符的问题是,在大多数情况下,每个XPath引擎都会导致按文档顺序排序的节点,不要确定某些'TypeA'是否包含其他一些节点。 – 2010-11-03 23:03:30

0

的形式,我认为你需要的一对夫妇的查询(可能是错的)

为VarVal1

//TypeA/@Attr1 

为VarVal5

//TypeA 
/TypeB[@Attr2="FixedVal2"] 
    /TypeC[@Attr3="FixedVal3"] 
    /TypeD[@Attr4="FixedVal4"] 
    /@Attr5 

想这些应该做的伎俩

编辑 - 错过VarText!

//TypeA 
/TypeB[@Attr2="FixedVal2"] 
    /TypeC[@Attr3="FixedVal3"] 
    /TypeD[@Attr4="FixedVal4"] 
+0

注意'text()',有时候会更好[不要使用它](http://www.xquery.com/tips_and_tricks/using_text_in_XPath.html)。 – 2010-11-03 19:44:36

+0

谢谢我没有意识到这一点。我会相应地更新我的答案 – 2010-11-03 19:50:03