使用xpath选择值中带破折号的属性

时间:2015-09-11 20:48:27

标签: xpath xquery exist-db

我正在使用exists-db来解析XML文档。我正在编写一个xquery脚本来处理文档。

我的XML输入看起来像这样

JobPage

我想使用xquery / xpath选择event / @ date =“2015-08-28”的所有事件。

我试过这个

NoneType

但是我回来了

<data>   
<schedules>
<schedule>
<event date="2015-08-28"/>
<event date="2015-08-29"/>
</schedule>
</schedules>
</data>

当我想要这个

let $rawDoc := collection("/db/test")/data/schedules/schedule[event/@date = "2015-08-28"]

似乎日期属性值或我的查询字符串中“ - ”的存在不被视为显式短划线。我不清楚如何逃避“ - ”?我尝试了“ - ”并且没有用(没有返回结果)。

有什么想法吗?

谢谢, TY

2 个答案:

答案 0 :(得分:0)

  

我想使用xquery / xpath选择event / @ date =“2015-08-28”的所有事件。

您使用:

let $rawDoc := collection("/db/test")/data/schedules/schedule[event/@date = "2015-08-28"]

这意味着,给我任何schedule个元素,该元素至少有一个孩子event与该日期相对应。

只需将其更改为:

let $rawDoc := collection("/db/test")/data/schedules/schedule/event[@date = "2015-08-28"]

这将为您提供该日期的所有活动元素。

答案 1 :(得分:0)

如果您想要返回schedule元素并排除所有没有所需日期的event元素子元素,您可以执行以下操作:

let $rawDoc := collection("/db/test")/data/schedules/schedule

for $schedule in $rawDoc
return element { node-name($schedule) } {
    $schedule/@*,
    $schedule/node()[self::event[@date='2015-08-28'] | 
                                 self::text() | 
                                 self::processing-instruction() | 
                                 self::comment()]
}

尽管如此,选择所需的event元素并将其返回到schedule元素中可能更容易:

let $rawDoc := collection("/db/test")/data/schedules/schedule/event[@date = "2015-08-28"]

for $event in $rawDoc
return <schedule>{$event}</schedule>