Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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_Xpathnavigator - Fatal编程技术网

Xml XPath在一个查询中连接父属性值和子属性值

Xml XPath在一个查询中连接父属性值和子属性值,xml,xpath,xpathnavigator,Xml,Xpath,Xpathnavigator,鉴于: 只需要寻找一个普通的Xpath1.0就可以实现这一点。尝试了varioud函数和谓词,但未能获得上述输出。 本质上,在阅读之后,我应该能够分辨出哪个“测试”属于哪个报告Id 尝试: /root/report/@Id |/root/report/property[@name=“test”] --但在单独的行中给出结果 /root/report/(@Id | property[@name=“test”])——但在单独的行中给出结果 concat(/root/report/@Id,/root/

鉴于:

只需要寻找一个普通的Xpath1.0就可以实现这一点。尝试了varioud函数和谓词,但未能获得上述输出。 本质上,在阅读之后,我应该能够分辨出哪个“测试”属于哪个报告Id

尝试:

/root/report/@Id |/root/report/property[@name=“test”]
--但在单独的行中给出结果

/root/report/(@Id | property[@name=“test”])
——但在单独的行中给出结果

concat(/root/report/@Id,/root/report/property[@name=“test”])
--给出错误(认为concat在单行结果上工作)


字符串连接(/root/report/@Id |/root/report/property[@name=“test”],',')
——所有连接都作为一行,甚至两个报告Id出现。

您可以使用它将Id保留在变量中:

Id=0, test=sdcs
Id=0, test=csd
Id=1, test=dcs
Id=1, test=gds
Id=1, test=jds
或更短:

for $report in /root/report 
return for $property in $report/property[@name="test"]
return concat("Id=", $report/@Id, ", ", $property/@name, "=", $property)

通过使主要的“迭代元素”成为最深的子元素,您可以非常优雅地实现这一点——在本例中,XML根元素是TABLE。看看我们如何“迭代”更深层的子级列。我们获取列的@name(第二个),并添加父级的-parent的@name属性

for $report in /root/report return
$report/property[@name="test"]/
concat("Id=", $report/@Id, ", ", @name, "=", .)

这样就不需要为父级的@name使用变量,这正是我所需要的!但是,不幸的是,XPath 1.0中不可用!!我认为这在XPath1中是不可能的,因为您只能选择每个节点一次,并且只能在最后选择值。除非对大小有严格限制(例如,只有两个报表节点)(您的第二个示例是XPath 2,不是1,不是吗?)是的,是XPath 2。我尝试了所有不同的选择,没有检查实际的系统。当您的解决方案意识到我使用XPath 1.0有一个限制时。
for $report in /root/report return
$report/property[@name="test"]/
concat("Id=", $report/@Id, ", ", @name, "=", .)
/TABLE/COLUMNS/COLUMN/concat(../../@name, ' : ', @name)