XPath/XQuery - 在排除某些元素时选择节点

Sta*_*n C 3 xml xpath xquery

我有一个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>
Run Code Online (Sandbox Code Playgroud)

这是我执行转换的代码:

<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>
Run Code Online (Sandbox Code Playgroud)

我明白了:

<?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>
Run Code Online (Sandbox Code Playgroud)

除了一个问题,这需要我所需要的95%.我需要从最终的XML中排除节点"颜色"和"价格",同时保留分组.

我试图在我的回复声明中执行以下操作:{$ car [color eq $ color]/*[not(self :: price)] [not(self :: color)]}

有点作品,但它完全消除了"汽车"元素!有什么建议?

小智 5

试试这个:

<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>  
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.