2016-09-24 178 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
了LineItem元素迭代

这个小组几乎肯定是你的朋友。看起来你想要聚合具有相同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