2010-06-09 56 views
1
檢查多個屬性

如果我有一些XML,如:的XPath:如何過類似的節點

<root> 
    <customers> 
     <customer firstname="Joe" lastname="Bloggs" description="Member of the Bloggs family"/> 
     <customer firstname="Joe" lastname="Soap" description="Member of the Soap family"/> 
     <customer firstname="Fred" lastname="Bloggs" description="Member of the Bloggs family"/> 
     <customer firstname="Jane" lastname="Bloggs" description="Is a member of the Bloggs family"/> 
    </customers> 
</root> 

如何得到的,純的XPath - 不是XSLT - 檢測行,其中姓氏相同XPath表達式,但有不同的描述?那麼它會拉上面的最後一個節點?

+1

你需要以更正式的方式定義輸出要求。也就是說,有4個節點具有相同的姓氏,但其中2個共享描述X,另外2個共享不同的描述Y.哪個應該在輸出中?另外,如果輸入具有不同姓氏的節點會發生什麼情況?如果特定的一組節點(由lastname定義)只包含一個節點 - 輸出它或不是? – 2010-06-09 17:34:00

+0

好問題(+1)。請參閱我的答案,以獲取選擇所需節點的XPath表達式。 :) – 2010-06-10 02:31:40

回答

1

如何得到的,純的XPath - 不是XSLT - 檢測行,其中姓氏相同XPath表達式,但 有不同的描述?

以下是如何與一個XPath表達式做到這一點:

"/*/*/customer 
     [@lastname='Bloggs' 
     and 
     not(@description 
      = preceding-sibling::*[@lastname='Bloggs']/@description 
      ) 
     ]" 

該表達式選擇所有<customer>元素與屬性lastname等於「布羅格斯」和不同值的屬性description的。

選擇的節點是:

<customer firstname="Joe" lastname="Bloggs" description="Member of the Bloggs family"/> 
<customer firstname="Jane" lastname="Bloggs" description="Is a member of the Bloggs family"/> 
+0

因此,不可能一次對所有姓氏進行此操作? – svick 2010-06-10 11:40:35

0
/root/customers/customer[@lastname='Bloggs' 
    and not(@description = preceding-sibling::*[@lastname='Bloggs']/@description) 
    and not(@description = following-sibling::*[@lastname='Bloggs']/@description)] 

這將有更好的表現的步驟做,雖然。

0

嗨,夥計們,謝謝,那就是天才!

但是,如果我只是針對Bloggs家族,那麼它可以正常工作,但是是否有可能對此進行概括,以便它適用於任何姓氏相同但描述不同的節點?

而且,是有可能有上了樹進一步引用節點這項工作,說怎麼樣以下幾點:

<root> 
    <customers index="1"> 
     <customer firstname="Joe" lastname="Bloggs" description="Member of the Bloggs family"/> 
     <customer firstname="Joe" lastname="Soap" description="Member of the Soap family"/> 
     <customer firstname="Fred" lastname="Bloggs" description="Member of the Bloggs family"/> 
     <customer firstname="Jane" lastname="Bloggs" description="Is a member of the Bloggs family"/> 
    </customers> 
    <customers index="2"> 
     <customer firstname="J" lastname="Bloggs" description="Member of the Bloggs family"/> 
     <customer firstname="J" lastname="Soap" description="Is a member of the Soap family"/> 
     <customer firstname="J" lastname="Smith" description="Member of the Smith family"/> 
    </customers> 
    <customers index="2"> 
     <customer firstname="J" lastname="Smith" description=""/> 
     <customer firstname="A" lastname="Soap" description="Member of the Smith family"/> 
    </customers> 
</root> 

所以我想拉以下節點:

Jane Bloggs in index=1 
J Soap in index=2 
J Smith in index=3 

如果你能幫忙,再次歡呼,希望我不會推它;)