首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XQuery :需要过滤提示

XQuery :需要过滤提示
EN

Stack Overflow用户
提问于 2011-06-29 05:23:01
回答 1查看 96关注 0票数 1

给定的XML文件记录如下

代码语言:javascript
复制
<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元素的子元素的值。

因此,我编写了以下查询:

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

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

代码语言:javascript
复制
<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 )语句不起作用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-29 17:38:31

where子句中,使用元素过滤子句的datum datum元素。您正在过滤基准元素,而不是过滤基准元素。

此表达式:

代码语言:javascript
复制
( $i/ADR-NSBG/timeline/datum/@datum/string(.) = $DATUM )

解析为:

代码语言:javascript
复制
(
 "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子句中的表达式选择所包含的timeline元素的两个子元素:

代码语言:javascript
复制
$i/ADR-NSBG/timeline/datum

如何过滤基准元素

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

代码语言:javascript
复制
$i/ADR-NSBG/timeline/datum[@datum eq $DATUM]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6513244

复制
相关文章

相似问题

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