2016-09-24 19 views
0

リクエストファイルを繰り返してビルドする必要があるxmlファイルがあります。私が書かれているXQueryは、私がproductCode != "NOT_AVAILABLE"XQueryを使用してXMLファイルを反復処理してXMLリクエストを作成する方法は?

declare function local:constructSubscriberLineItems($LineItems){ 
    for $productCode in distinct-values($LineItems/LineItem/ProductCode) 
    let $entries := $LineItems/LineItem[ProductCode = $productCode] 
    let $notAvailable := $entries[ProductCode/text() = "NOT_AVAILABLE"] 
    for $distinctProductType in distinct-values($notAvailable/ProductType) 
    let $productType := $notAvailable[ProductType = $distinctProductType] 
    for $distinctBillingCode in distinct-values($productType/BillingCode) 
    let $BillingCode := $productType[BillingCode = $distinctBillingCode] 
    let $subscriberLineItemDetails := 

    <subscriberLineItemDetails> 
     <productType>{distinct-values($BillingCode/ProductType/text())}</productType> 
     <productCode>{distinct-values($BillingCode/ProductCode/text())}</productCode> 
     <billingCode>{distinct-values($BillingCode/BillingCode/text())}</billingCode> 
     <quantity>{sum($BillingCode/Quantity)}</quantity> 
    </subscriberLineItemDetails> 

    return $subscriberLineItemDetails 
}; 

サンプルXML

<LineItems> 
    <LineItem> 
     <Id>01</Id> 
     <ProductCode>prod123456</ProductCode> 
     <BillingCode>CHE001</BillingCode> 
     <ProductType>HARDGOOD</ProductType> 
     <Quantity>10</Quantity> 
    </LineItem> 
    <LineItem> 
     <Id>02</Id> 
     <ProductCode>prod123456</ProductCode> 
     <BillingCode>CHE001</BillingCode> 
     <ProductType>HARDGOOD</ProductType> 
     <Quantity>10</Quantity> 
    </LineItem> 
    <LineItem> 
     <Id>03</Id> 
     <ProductCode>prod123456</ProductCode> 
     <BillingCode>CHE001</BillingCode> 
     <ProductType>HARDGOOD</ProductType> 
     <Quantity>10</Quantity> 
    </LineItem> 
    <LineItem> 
     <Id>04</Id> 
     <ProductCode>prod6789</ProductCode> 
     <BillingCode>CHE001</BillingCode> 
     <ProductType>HARDGOOD</ProductType> 
     <Quantity>4</Quantity> 
    </LineItem> 
    <LineItem> 
     <Id>05</Id> 
     <ProductCode>prod6789</ProductCode> 
     <BillingCode>CHE001</BillingCode> 
     <ProductType>HARDGOOD</ProductType> 
     <Quantity>5</Quantity> 
    </LineItem> 
    <LineItem> 
     <Id>06</Id> 
     <ProductCode>prod6789</ProductCode> 
     <BillingCode>CHE001</BillingCode> 
     <ProductType>HARDGOOD</ProductType> 
     <Quantity>7</Quantity> 
    </LineItem> 
    <LineItem> 
     <Id>07</Id> 
     <ProductCode>NOT_AVAILABLE</ProductCode> 
     <BillingCode>BANG001</BillingCode> 
     <ProductType>OPTIONAL_FEATURE</ProductType> 
     <Quantity>7</Quantity> 
    </LineItem> 
    <LineItem> 
     <Id>08</Id> 
     <ProductCode>NOT_AVAILABLE</ProductCode> 
     <BillingCode>BANG001</BillingCode> 
     <ProductType>OPTIONAL_FEATURE</ProductType> 
     <Quantity>7</Quantity> 
    </LineItem> 
    <LineItem> 
     <Id>09</Id> 
     <ProductCode>NOT_AVAILABLE</ProductCode> 
     <BillingCode>TRV001</BillingCode> 
     <ProductType>OPTIONAL_FEATURE</ProductType> 
     <Quantity>7</Quantity> 
    </LineItem> 
    <LineItem> 
     <Id>10</Id> 
     <ProductCode>NOT_AVAILABLE</ProductCode> 
     <BillingCode>BANG001</BillingCode> 
     <ProductType>INCLUDED_FEATURE</ProductType> 
     <Quantity>7</Quantity> 
    </LineItem> 
    <LineItem> 
     <Id>11</Id> 
     <ProductCode>NOT_AVAILABLE</ProductCode> 
     <BillingCode>BANG001</BillingCode> 
     <ProductType>INCLUDED_FEATURE</ProductType> 
     <Quantity>7</Quantity> 
    </LineItem> 
    <LineItem> 
     <Id>12</Id> 
     <ProductCode>NOT_AVAILABLE</ProductCode> 
     <BillingCode>TRV001</BillingCode> 
     <ProductType>INCLUDED_FEATURE</ProductType> 
     <Quantity>7</Quantity> 
    </LineItem> 
</LineItems> 

予想される出力

<subscriberLineItemDetails> 
    <productType>HARDGOOD</productType> 
    <productCode>prod123456</productCode> 
    <billingCode>CHE001</billingCode> 
    <quantity>30</quantity> 
</subscriberLineItemDetails> 
<subscriberLineItemDetails> 
    <productType>HARDGOOD</productType> 
    <productCode>prod6789</productCode> 
    <billingCode>CHE001</billingCode> 
    <quantity>16</quantity> 
</subscriberLineItemDetails> 
<subscriberLineItemDetails> 
    <productType>OPTIONAL_FEATURE</productType> 
    <productCode>NOT_AVAILABLE</productCode> 
    <billingCode>BANG001</billingCode> 
    <quantity>14</quantity> 
</subscriberLineItemDetails> 
<subscriberLineItemDetails> 
    <productType>OPTIONAL_FEATURE</productType> 
    <productCode>NOT_AVAILABLE</productCode> 
    <billingCode>TRV001</billingCode> 
    <quantity>7</quantity> 
</subscriberLineItemDetails> 
<subscriberLineItemDetails> 
    <productType>INCLUDED_FEATURE</productType> 
    <productCode>NOT_AVAILABLE</productCode> 
    <billingCode>BANG001</billingCode> 
    <quantity>14</quantity> 
</subscriberLineItemDetails> 
<subscriberLineItemDetails> 
    <productType>INCLUDED_FEATURE</productType> 
    <productCode>NOT_AVAILABLE</productCode> 
    <billingCode>TRV001</billingCode> 
    <quantity>7</quantity> 
</subscriberLineItemDetails> 
+0

どのバージョンのXQuery /実行エンジンですか?これが3.0だった場合、あなたのコードはおそらく単純化されるでしょう。 –

+0

@CharlesDuffyはいバージョン3.0 – Beginner

答えて

0
を持っていたもののLineItemsを含める方法にとして立ち往生していますすべての要素を反復処理されていません

group by節はほとんど確かにあなたの友人です。同じProductCodeを持つLineItemを集計し、「NOT_AVAILABLE」の項目で少し違うことをしたいようです。私は、あなたが利用可能なものではなく、(値の他の組み合わせに基づいてそれらを集計する必要があるかどうかにかかわらず)異なるために必要なものを正確に得ることはできませんが、次のコードはあなたを得るでしょう。

for $items in LineItems/LineItem 
group by $val := $items/ProductCode 
return 
if ($val != 'NOT_AVAILABLE') then 
    <subscriberLineItemDetails> 
     <productType>{$items[1]/ProductType/text()}</productType> 
     <productCode>{$val}</productCode> 
     <billingCode>{$items[1]/BillingCode/text()}</billingCode> 
    <quantity>{sum($items/Quantity)}</quantity> 
    </subscriberLineItemDetails> 
else 
(: Different handling for NOT_AVAILABLE line items. You can add a group by clause for these as well 
    if you need to aggregate them in some way :) 
for $item in $items 
return 
    <subscriberLineItemDetails> 
    <productType>{$item/ProductType/text()}</productType> 
    <productCode>{$item/ProductCode}</productCode> 
    <billingCode>{$item/BillingCode/text()}</billingCode> 
    <quantity>{sum($item/Quantity)}</quantity> 
    </subscriberLineItemDetails> 
+0

ここで言及したのと同じロジックをコーディングしました。努力を感謝します。ありがとう – Beginner

関連する問題