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

Posted

技术标签:

【中文标题】使用 xpath 选择值中带有破折号的属性【英文标题】:using xpath to select an attribute with a dash in the value 【发布时间】:2015-12-08 12:18:48 【问题描述】:

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

我的 XML 输入看起来像这样

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

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

我试过了

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

但我得到了这个

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

当我想要这个时

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

日期属性值或我的查询字符串中的“-”似乎没有被视为显式破折号。我不清楚如何逃避“-”?我尝试了“-”,但没有成功(没有返回结果)。

有什么想法吗?

谢谢, 类型

【问题讨论】:

如果您选择/data/schedules/schedule[...],您将获得该元素的全部内容,其中包括任何后代event 元素。也许改为选择event 元素?或者为什么需要schedule 元素? 你关于它与连字符有关的理论与推测它取决于月相一样疯狂。 以下答案是否有帮助?请将其中一个标记为答案,以便此问题不再显示为“未回答”。 【参考方案1】:

我想使用 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"]

这将为您提供具有该日期的所有事件元素。

【讨论】:

【参考方案2】:

如果您想返回 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>

【讨论】:

谢谢;我误以为 /schedule[event/@date] 会选择“仅”,而不是“任何”。我想在输出中捕获周围的“schedules/schedule”父节点,因此我最初决定选择 /schedule[event/@date] 而不是 /schedule/event[@date] 的原因。感谢您为我提供了一种保留父节点的方法。 您也可以考虑选择相关的schedules,然后使用XSLT 转换信息。使用修改后的身份转换通过几个空模板修剪不需要的内容可能更简单/容易:en.wikipedia.org/wiki/Identity_transform

以上是关于使用 xpath 选择值中带有破折号的属性的主要内容,如果未能解决你的问题,请参考以下文章

回顾CSS,查缺补漏

xpath 选择按属性值列表排除的节点

XPath 按属性值选择元素

具有特定值的任何属性的所有元素的 XPath?

使用 XPath,如何根据节点的文本内容和属性值来选择节点?

选择具有可变数据属性的元素,但有些带有破折号