2012-04-21 8 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からノード "color"と "price"を除外する必要があります。

は、私は私の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

私はblack sowlのソリューションが好きですが、私は次の少し洗練されたバージョンのコードをお勧めします。これらの方法でクリーナー:

  1. 車以来//車を使用する必要はありませんが、ルート要素
  2. である第一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> 
    
対単一の項目を示すために、変数名で&複数
関連する問題