2016-09-24 2 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

관련 문제