2012-04-21 87 views
3

我有一个XML文件,我需要修改。首先,我需要做一个小组,然后排除几个节点。XPath/XQuery - 选择一个节点,同时排除一些元素

<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中排除节点“颜色”和“价格”,同时保留分组。

我试图做我return语句如下: {$车[彩EQ $颜色]/* [不(个体经营::价)] [未(个体经营::颜色)]}

种类的作品,但它完全消除了“汽车”元素!有什么建议?

回答

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> 

希望这有助于。

0

请注意,在XPath中,您无法创建新节点。您既可以返回输入文档中已有的节点,也可以计算计数和总计等值,但如果您需要新的或修改的节点树,则需要XSLT或XQuery。

如果您的输出将与您的输入类似,只需稍作更改,那么XSLT解决方案通常比XQuery解决方案简单得多。

1

我喜欢黑色的母鸡的解决方案,但我建议下面稍微干净的版本的代码。在这些方面清洁:

  1. 没有必要,因为汽车使用//汽车是根元素
  2. 第1 return语句是不必要的
  3. 无需反复横向汽车/汽车
  4. 使用单数&复数变量名以指示单个项目对序列

    <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> 
    
相关问题