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查询中遇到了问题