首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用XQuery遍历XML文件来构建XML请求?

如何使用XQuery遍历XML文件来构建XML请求?
EN

Stack Overflow用户
提问于 2016-09-25 06:14:55
回答 1查看 140关注 0票数 0

我有一个xml文件,在其中我必须迭代并构建一个请求文件。我编写的XQuery并没有遍历所有元素,我被困在如何包含那些具有productCode != "NOT_AVAILABLE"的行项目中

代码语言:javascript
复制
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

代码语言:javascript
复制
<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>

预期输出

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-26 21:06:48

group by子句几乎可以肯定是您的朋友。看起来您想要聚合具有相同ProductCode的可用项,并对‘NOT_ LineItems’项做一些稍微不同的事情。我不知道您需要为不可用的值做哪些不同的事情(是否需要根据其他值的组合聚合这些值),但是下面的代码应该可以让您上路。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39681436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档