Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 将父属性的值和子节点的文本值与单个xpath查询相结合_Xml_Xpath_Attributes_Extract - Fatal编程技术网

Xml 将父属性的值和子节点的文本值与单个xpath查询相结合

Xml 将父属性的值和子节点的文本值与单个xpath查询相结合,xml,xpath,attributes,extract,Xml,Xpath,Attributes,Extract,根据一个参数的值,我试图提取一个节点的文本 孩子1\u父母1 孩子2\u家长1 孩子3\u父母1 孩子4\u父母1 子女1_父母2 儿童2_父母2 儿童4_父母2 儿童3_父母2 我希望在使用“child1”运行匹配查询时获得此输出: 同时查询两个值 此查询: //Parent[@id='1']/Children/child[text()[匹配(,“^child1”,“i”)]]/(text()|..../@name) 收益率: {}name="Parent_1" child1_Paren

根据一个参数的值,我试图提取一个节点的文本


孩子1\u父母1
孩子2\u家长1
孩子3\u父母1
孩子4\u父母1
子女1_父母2
儿童2_父母2
儿童4_父母2
儿童3_父母2
我希望在使用“child1”运行匹配查询时获得此输出:

同时查询两个值 此查询:

//Parent[@id='1']/Children/child[text()[匹配(,“^child1”,“i”)]]/(text()|..../@name)
收益率:

{}name="Parent_1"
child1_Parent_1
这和我想要的结果很接近。但是我想要干净的属性值,不带属性名

使用xs:string清除属性值 这可以通过字符串转换来完成:

//Parent[@id='1']/Children/child[text()[匹配(,“^child1”,“i”)]]/xs:string(../../@name)
这给了我一个干净的属性值:

Parent_1
两种查询的组合? 我认为应该可以将这两个问题结合起来:

//Parent[@id='1']/Children/child[text()[匹配(,“^child1”,“i”)]]/(text()| xs:string(../../@name))
但这导致了一个我不理解的错误:

stdin:26: query failed, Error: Sequence does not match type node()* - found item of type {http://www.w3.org/2001/XMLSchema}string [err:XPTY0004]

我尝试了不同的方法来组合查询,但都不起作用。我正在使用Berkeley DB XML中的dbxml shell进行测试。

我不知道我是否正确理解了这一点,但是下面的
XPath
-表达式将使用
concat()
string()
读取并合并您要查找的两个值:

concat(string(//Parent[@id=1]/@name) ,'
',string(//Parent[@id=1]/Children/child[@name='Child_1']/text()))
在中间你可以找到
”
',应该插入换行符,但这取决于您的实际需要


测试了这个

我不知道我是否理解正确,但是下面的
XPath
-表达式将使用
concat()
string()

concat(string(//Parent[@id=1]/@name) ,'
',string(//Parent[@id=1]/Children/child[@name='Child_1']/text()))
在中间你可以找到
”
',应该插入换行符,但这取决于您的实际需要


测试了这个

要在XPath 1.0中选择多个节点,您可以使用union操作符
|

//Parent[@id='1']/@name | //Parent[@id='1']/Children/child[@name='Child_1']/text()
XPath 2.0(由Berkeley DB XML支持)允许:

for $child in //Parent[@id='1']/Children/child[matches(.,"^child1","i")]
return ($child/text(), $child/../../string(@name))
两者都会为输入样本选择一个属性节点和一个文本节点


规范:

要在XPath 1.0中选择多个节点,可以使用union运算符
|

//Parent[@id='1']/@name | //Parent[@id='1']/Children/child[@name='Child_1']/text()
XPath 2.0(由Berkeley DB XML支持)允许:

for $child in //Parent[@id='1']/Children/child[matches(.,"^child1","i")]
return ($child/text(), $child/../../string(@name))
两者都会为输入样本选择一个属性节点和一个文本节点


规范:

虽然@Tomalak给出了正确的答案,但它在dbxml shell中的工作原理如下:

dbxml> prepare "for $child in collection('test.dbxml')//Parent[@id='1']/Children/child[matches(.,'^child1','i')] return ($child/text(), $child/../../string(@name))"
Prepared expression 'for $child in collection('test.dbxml')//Parent[@id='1']/Children/child[matches(.,'^child1','i')] return ($child/text(), $child/../../string(@name))'

dbxml> query
2 objects returned for eager expression 'for $child in collection('test.dbxml')//Parent[@id='1']/Children/child[matches(.,'^child1','i')] return ($child/text(), $child/../../string(@name))'

dbxml> print
child1_Parent_1
Parent_1

@Tomalak给出了正确的答案,下面是它在dbxml shell中的工作原理:

dbxml> prepare "for $child in collection('test.dbxml')//Parent[@id='1']/Children/child[matches(.,'^child1','i')] return ($child/text(), $child/../../string(@name))"
Prepared expression 'for $child in collection('test.dbxml')//Parent[@id='1']/Children/child[matches(.,'^child1','i')] return ($child/text(), $child/../../string(@name))'

dbxml> query
2 objects returned for eager expression 'for $child in collection('test.dbxml')//Parent[@id='1']/Children/child[matches(.,'^child1','i')] return ($child/text(), $child/../../string(@name))'

dbxml> print
child1_Parent_1
Parent_1

那么您想在一次调用中获取
//Parent[@id=1]/@name
的值和
//Parent[@id=1]/Children/child[@name='child\u 1']]]/text()的值吗?您的最终目标是什么?基本上,我正在寻找第一个查询的两个结果,但是没有属性名称,我稍微改进了问题,使其更加清晰。您想在一次调用中获得
//Parent[@id=1]/@name
的值和
//Parent[@id=1]/Children[@name='child\u 1']]/text()
的值吗?你的最终目标是什么?基本上,我在寻找第一个查询的两个结果,但是没有属性名称,我在某种程度上改进了这个问题,使之更清晰。谢谢,但这将是两个独立的查询。我希望这可以在一个查询中完成,类似于我列出的第一个查询。谢谢,但这将是两个单独的查询。我希望这可以在一个单一的查询中完成,类似于我列出的第一个查询。谢谢你的回答!我最初发布的示例是有缺陷的,实际上我使用的是一个更昂贵的带有字符匹配的基本查询-我已经相应地更新了示例。我希望避免在基本查询中进行两次匹配,如果可能的话,使用xpath。整洁,谢谢!需要对dbxml进行一些修改,但看起来不错!您可能需要在答案中添加“../../string(@name)),因为我在XPath 1.0查询中遇到了问题,请您回答!我最初发布的示例是有缺陷的,实际上我使用的是一个更昂贵的带有字符匹配的基本查询-我已经相应地更新了示例。我希望避免在基本查询中进行两次匹配,如果可能的话,使用xpath。整洁,谢谢!需要对dbxml进行一些修改,但看起来不错!您可能需要在答案中添加“../../string(@name)),因为我在XPath 1.0查询中遇到了问题