XQuery:需要过滤提示

时间:2011-06-28 21:23:01

标签: filter xquery

给出像这样的XML文件记录

<ADR-NSBG>
    <timeline timestamp="2011-06-09T00:15:00">
        <datum datum="SGC_at_bsNo-14___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2">
            <sbgSipTotalIncSipRequests>4314320</sbgSipTotalIncSipRequests>
            <sbgSipTotalIncSipResponses>9040481</sbgSipTotalIncSipResponses>
            <sbgSipTotalIncFailureResponses>2321242</sbgSipTotalIncFailureResponses>
            <sbgSipTotalOutSipRequests>9136608</sbgSipTotalOutSipRequests>
            <sbgSipTotalOutSipResponses>4643002</sbgSipTotalOutSipResponses>
            <sbgSipTotalOutFailureResponses>1027420</sbgSipTotalOutFailureResponses>
            <sbgSipIncommingProvisionalResponses>3433875</sbgSipIncommingProvisionalResponses>
            <sbgSipOutgoingProvisionalResponses>1845750</sbgSipOutgoingProvisionalResponses>
        </datum>
        <datum datum="SGC_at_bsNo-13___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2">
            <sbgSipTotalIncSipRequests>4799739</sbgSipTotalIncSipRequests>
            <sbgSipTotalIncSipResponses>9335965</sbgSipTotalIncSipResponses>
            <sbgSipTotalIncFailureResponses>2415690</sbgSipTotalIncFailureResponses>
            <sbgSipTotalOutSipRequests>9474295</sbgSipTotalOutSipRequests>
            <sbgSipTotalOutSipResponses>5291708</sbgSipTotalOutSipResponses>
            <sbgSipTotalOutFailureResponses>1149950</sbgSipTotalOutFailureResponses>
            <sbgSipIncommingProvisionalResponses>3516298</sbgSipIncommingProvisionalResponses>
            <sbgSipOutgoingProvisionalResponses>2190601</sbgSipOutgoingProvisionalResponses>
        </datum>
    </timeline>
</ADR-NSBG>

我想要的是获取datum元素子元素的值。

所以,我写了以下查询:

for         $i in collection("/db/_DEMO/ADR-NSBG/sipTransactTM/2011/06/09")
let         $TIME_FROM := "2011-06-09T00:15:00"
let         $TIME_TO := "2011-06-09T00:45:00"
let         $DATUM := "SGC_at_bsNo-13___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2"
where       ( $i/ADR-NSBG/timeline/@timestamp/string(.) >= $TIME_FROM and
            $i/ADR-NSBG/timeline/@timestamp/string(.) <= $TIME_TO) and
            ( $i/ADR-NSBG/timeline/datum/@datum/string(.) = $DATUM )
order by    $i/ADR-NSBG/timeline/@timestamp/string(.)
return      $i/ADR-NSBG/timeline/datum

但是,问题是我无法在两个“基准”节点之间进行选择。 查询的结果是:

<datum datum="SGC_at_bsNo-14___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2">
    <sbgSipTotalIncSipRequests>4314320</sbgSipTotalIncSipRequests>
    <sbgSipTotalIncSipResponses>9040481</sbgSipTotalIncSipResponses>
    <sbgSipTotalIncFailureResponses>2321242</sbgSipTotalIncFailureResponses>
    <sbgSipTotalOutSipRequests>9136608</sbgSipTotalOutSipRequests>
    <sbgSipTotalOutSipResponses>4643002</sbgSipTotalOutSipResponses>
    <sbgSipTotalOutFailureResponses>1027420</sbgSipTotalOutFailureResponses>
    <sbgSipIncommingProvisionalResponses>3433875</sbgSipIncommingProvisionalResponses>
    <sbgSipOutgoingProvisionalResponses>1845750</sbgSipOutgoingProvisionalResponses>
</datum>
<datum datum="SGC_at_bsNo-13___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2">
    <sbgSipTotalIncSipRequests>4799739</sbgSipTotalIncSipRequests>
    <sbgSipTotalIncSipResponses>9335965</sbgSipTotalIncSipResponses>
    <sbgSipTotalIncFailureResponses>2415690</sbgSipTotalIncFailureResponses>
    <sbgSipTotalOutSipRequests>9474295</sbgSipTotalOutSipRequests>
    <sbgSipTotalOutSipResponses>5291708</sbgSipTotalOutSipResponses>
    <sbgSipTotalOutFailureResponses>1149950</sbgSipTotalOutFailureResponses>
    <sbgSipIncommingProvisionalResponses>3516298</sbgSipIncommingProvisionalResponses>
    <sbgSipOutgoingProvisionalResponses>2190601</sbgSipOutgoingProvisionalResponses>
</datum>

我想问你的是:为什么声明( $i/ADR-NSBG/timeline/datum/@datum/string(.) = $DATUM )不起作用?

1 个答案:

答案 0 :(得分:0)

where子句中,您使用基准元素过滤for子句的 $ i 元素。您过滤基准元素。

这个表达式:

( $i/ADR-NSBG/timeline/datum/@datum/string(.) = $DATUM )

解决了:

(
 "SGC_at_bsNo-14___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2",
 "SGC_at_bsNo-13___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2"
) =
 "SGC_at_bsNo-13___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2"

这是真的。因此,选择 $ i 元素。之后,return子句中的表达式选择包含的时间轴元素的两个子元素:

$i/ADR-NSBG/timeline/datum

如何过滤基准元素

如果您只想选择具有特定字符串的数据,则需要在return子句中进行过滤:

$i/ADR-NSBG/timeline/datum[@datum eq $DATUM]