1

xmlファイルについて考えてみましょう。

<warehouse>
- may be some tag on upper level of dep present, may be not
<dep no ="2">
    <item>
        <itemName> Item 1  </itemName>
        <supplier> Supp1 </supplier>
        <supplier> Supp2 </supplier>
    </item>
</dep>
<dep no ="1">
    <item>
        <itemName> Item 2  </itemName>
        <supplier> Supp1 </supplier>
        <supplier> Supp3 </supplier>
    </item>
</dep>
.......
</warehouse>

注:depタグの上にいくつかのタグがあるか、欠落している可能性があります。

サプライヤーのリストをリストに表示する必要があります。サプライヤーが作成するアイテム名と、各アイテムの前に部門名を表示します。

Supp2
 Item1, 2
Supp1
 Item1, 2
 Item2, 1

これは私のコードです:

<ul>
{
for $sup in distinct-values(doc("warehouse.xml")//supplier)
for $item in doc("warehouse.xml")//item[supplier = $sup]

return <li>{data($sup)} <ul> {
let $n:= $item/itemName
let $y:= doc("warehouse.xml")//dep[//itemName=$n]/@no 
for $n1 in $n return <li>{data($n1), data($y)} </li>} </ul> </li>
}
</ul>

私は2つの問題に直面しています。1つは、yが1から始まるすべての部門番号を表示することです。もう1つは、1つのサプライヤがあり、2つのアイテムを生産するのではなく

Supp1
 Item1, 2
 Item2, 3

私は得る

Supp1
 Item1, 1,2, ...
Supp1
 Item2, 1,2, ...

何が悪いのか提案していただけますか?心から感謝しています。

4

1 に答える 1

2

XQueryを初めて使用する場合は、次のように書くことができます。

入力:

<warehouse>
  <something/>
  <dep no ="2">
    <item>
      <itemName>Item1</itemName>
      <supplier>Supp1</supplier>
      <supplier>Supp2</supplier>
    </item>
  </dep>
  <anything/>
  <dep no ="1">
    <item>
      <itemName>Item2</itemName>
      <supplier>Supp1</supplier>
      <supplier>Supp3</supplier>
    </item>
  </dep>
  <whatever/>
</warehouse>

クエリ:

<ul>{
(: the ../text() can be dropped from everywhere :)
let $doc := doc("input.xml")    
for $supplier in distinct-values($doc//supplier/text())
let $items := $doc//item[supplier/text() = $supplier]/itemName/text()
return <li>{$supplier}: {string-join($items, ", ")}</li>
}</ul>

出力:

<ul>
  <li>Supp1: Item1, Item2</li>
  <li>Supp2: Item1</li>
  <li>Supp3: Item2</li>
</ul>

クエリの背後にある理論は次のとおりです。

  • 基本的にサプライヤごとにグループ化するすべてのサプライヤのアイテム名を一覧表示する必要があるためです。このためには、入力に存在するすべての一意のサプライヤを反復処理する必要があります。

    distinct-values($doc//supplier/text())
    
  • この後、特定のサプライヤに関連付けられているすべてのアイテムを一覧表示します。

    $doc//item[supplier/text() = $supplier]/itemName/text()
    

    つまり、サプライヤ名が指定されたサプライヤの名前と等しい入力内のすべてのアイテムを取得し、これらの(フィルタリングされた)アイテムの名前を取得します。

そしてそれはそれでした。私が理にかなっていることを願っています!

于 2012-04-10T12:53:15.430 に答える