Xml XPath在一个查询中连接父属性值和子属性值
鉴于: 只需要寻找一个普通的Xpath1.0就可以实现这一点。尝试了varioud函数和谓词,但未能获得上述输出。 本质上,在阅读之后,我应该能够分辨出哪个“测试”属于哪个报告Id 尝试: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/
/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)