[英]XPath/XQuery - Selecting a node while excluding some elements
我有一个XML文件,我需要修改。 首先,我需要进行分组,然后排除几个节点。
<cars>
<car>
<make>Toyota</make>
<model>Camry</model>
<color>White</color>
<price>123</price>
</car>
<car>
<make>Honda</make>
<model>Accord</model>
<color>White</color>
<price>423</price>
</car>
</cars>
这是我执行转换的代码:
<root>
{
for $color in distinct-values(doc('cars.xml')//cars/car/color)
let $car := doc('cars.xml')//cars/car
return <appearance color="{$color}">
{ $car[color eq $color ] }
</appearance>
}
</root>
我明白了:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<appearance color="White">
<car>
<make>Toyota</make>
<model>Camry</model>
<color>White</color>
<price>123</price>
</car>
<car>
<make>Honda</make>
<model>Accord</model>
<color>White</color>
<price>423</price>
</car>
</appearance>
</root>
除了一个问题,这需要我所需要的95%。 我需要从最终的XML中排除节点“颜色”和“价格”,同时保留分组。
我试图在我的回复声明中执行以下操作:{$ car [color eq $ color] / * [not(self :: price)] [not(self :: color)]}
有点作品,但它完全消除了“汽车”元素! 有什么建议?
试试这个:
<root>
{
let $cars-doc := doc('cars.xml')
let $color := distinct-values($cars-doc//cars/car/color)
return
for $carcolor in $color
return
<appearance color="{$carcolor}">
{
for $car in $cars-doc//cars/car
where $car/color = $carcolor
return
<car>
{$car/*[not(self::color or self::price)]}
</car>
}
</appearance>
}
</root>
希望这可以帮助。
我喜欢黑色sowl的解决方案,但我建议使用以下稍微清洁的代码版本。 通过以下方式清洁:
在变量名中使用单数和复数来表示单项与序列
<root> { let $cars := doc('cars.xml')//car let $colors := distinct-values($cars/color) for $color in $colors return <appearance color="{$color}"> { for $car in $cars[color = $color] return <car> {$car/*[not(self::color or self::price)]} </car> } </appearance> } </root>
请注意,在XPath中,您无法创建新节点。 您可以返回输入文档中已存在的节点,也可以计算计数和总计等值,但如果需要新的或修改的节点树,则需要XSLT或XQuery。
如果您的输出与您的输入类似,只需进行少量更改,那么XSLT解决方案通常比XQuery解决方案简单得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.