Xml PerlXPath:use";及;返回两个节点 汪汪 哞 啁啾声

Xml PerlXPath:use";及;返回两个节点 汪汪 哞 啁啾声,xml,perl,xpath,Xml,Perl,Xpath,我使用的是XML::LibXML,版本1.0,我只想在两个XPath表达式(条件)都满足时返回节点 如果我使用垂直或条形|,此XPath表达式将起作用: //dog[.=“woof”]|//bird[.=“chirp”]如果有几只狗和一只鸟(或反之亦然),应该返回什么还不清楚 您可以首先检查是否至少有两个节点满足条件,然后选择它们: <pets> <dog>woof</dog> <cow>moo</cow> <bird

我使用的是
XML::LibXML
,版本1.0,我只想在两个XPath表达式(条件)都满足时返回节点

如果我使用垂直
条形
|
,此XPath表达式将起作用:


//dog[.=“woof”]|//bird[.=“chirp”]
如果有几只狗和一只鸟(或反之亦然),应该返回什么还不清楚

您可以首先检查是否至少有两个节点满足条件,然后选择它们:

<pets>
  <dog>woof</dog>
  <cow>moo</cow>
  <bird>chirp</bird>
</pets>

(在其中测试,它非常适合使用XPath表达式)

不清楚如果有几只狗和一只鸟(反之亦然),应该返回什么

您可以首先检查是否至少有两个节点满足条件,然后选择它们:

<pets>
  <dog>woof</dog>
  <cow>moo</cow>
  <bird>chirp</bird>
</pets>
(在其中进行了测试,该测试非常适合使用XPath表达式)

/*[dog=“woof”和bird=“chirp”]/*[self::dog=“woof”或self::bird=“chirp”] 或

//dog[.=“woof”和../bird=“chirp”]|
//鸟[.=“唧唧”和../dog=“呜呜”]

选项1-俯视法

让我们首先假设您想要返回
pets
元素。为此,我们可以使用以下方法:

/*[dog=“woof”和bird=“chirp”]

[…]
可以看作WHERE子句。上面返回
pets
元素,其中
dog=“woof”和bird=“chirp”
为真

以下内容也适用(其中
dog=“woof”
为真,而
bird=“chirp”
为真):

/*[dog=“woof”][bird=“chirp”]

我们可以自定义它,通过添加它来返回其他东西

/*[dog=“woof”和bird=“chirp”]/(dog[.=“woof”]| bird[.=“chirp”])

如您所见,
|
是联合运算符,它将两组节点组合在一起

一个问题。XML::LibXML不支持这种语法,因为libxml2只支持XPath1.0。可以进行小的调整以进行补偿

/*[dog=“woof”和bird=“chirp”]/*[self::dog=“woof”或self::bird=“chirp”]


选项2-查找/绕行方法

另一种表述先前搜索的方式是:将另一个作为兄弟的狗和鸟

//dog[.=“woof”和../bird=“chirp”]|
//鸟[.=“唧唧”和../dog=“呜呜”]


[根据@kjhughes答案,尽可能简化为
dog[.=“woof”]
dog=“woof”

/*[dog=“woof”和bird=“chirp”]/*[self::dog=“woof”或self::bird=“chirp”]

//dog[.=“woof”和../bird=“chirp”]|
//鸟[.=“唧唧”和../dog=“呜呜”]

选项1-俯视法

让我们首先假设您想要返回
pets
元素。为此,我们可以使用以下方法:

/*[dog=“woof”和bird=“chirp”]

[…]
可以看作WHERE子句。上面返回
pets
元素,其中
dog=“woof”和bird=“chirp”
为真

以下内容也适用(其中
dog=“woof”
为真,而
bird=“chirp”
为真):

/*[dog=“woof”][bird=“chirp”]

我们可以自定义它,通过添加它来返回其他东西

/*[dog=“woof”和bird=“chirp”]/(dog[.=“woof”]| bird[.=“chirp”])

如您所见,
|
是联合运算符,它将两组节点组合在一起

一个问题。XML::LibXML不支持这种语法,因为libxml2只支持XPath1.0。可以进行小的调整以进行补偿

/*[dog=“woof”和bird=“chirp”]/*[self::dog=“woof”或self::bird=“chirp”]


选项2-查找/绕行方法

另一种表述先前搜索的方式是:将另一个作为兄弟的狗和鸟

//dog[.=“woof”和../bird=“chirp”]|
//鸟[.=“唧唧”和../dog=“呜呜”]


[根据@kjhughes的回答,尽可能将简化的
dog[.=“woof”]
转换为
dog=“woof”
。]

将分别选择字符串值为
“woof”
“chirp”
且存在于公共父元素中的所有
dog
bird
元素:

//*[dog="woof" and bird="chirp"]/*[self::dog="woof" or self::bird="chirp"]
woof
啁啾声
功劳:@ikegami在解释OP意图方面的帮助是不可或缺的。一定要记住他的答案


旁注:
|
是一个联合运算符(在XPath 1.0和XPath 2.0中都是)。这是不符合逻辑或不合理的


这个

将分别选择字符串值为
“woof”
“chirp”
且存在于公共父元素中的所有
dog
bird
元素:

//*[dog="woof" and bird="chirp"]/*[self::dog="woof" or self::bird="chirp"]
woof
啁啾声
功劳:@ikegami在解释OP意图方面的帮助是不可或缺的。一定要记住他的答案


旁注:
|
是一个联合运算符(在XPath 1.0和XPath 2.0中都是)。这是不符合逻辑或不合理的



谢谢各位。。。抱歉,我只想返回匹配的节点,等于和,即使有多个匹配。。。但是我不想要父节点;我也不想在xpath表达式中指定/使用绝对“pets”路径来避免返回父节点。我喜欢这个Choroba://*[狗[.=“呜呜”][鸟[.=“唧唧”]]/*[名字()=“狗”和.=“呜呜”或名字()=“鸟”和.=“唧唧”]在第二个选项上有轻微的变化://*[狗[.=“唧唧”]/*[狗[.=“呜呜”]或//鸟[.=“唧唧”]@pp,不,那(包括牛)。你要去的地方。我的答案更简单。请注意,使用
名称
(不检查名称空间)可能会导致问题(破坏X的扩展性)