【问题标题】:using xpath to select an attribute with a dash in the value使用 xpath 选择值中带有破折号的属性
【发布时间】: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 元素?
  • 你关于它与连字符有关的理论与推测它取决于月相一样疯狂。
  • 以下答案是否有帮助?请将其中一个标记为答案,以便此问题不再显示为“未回答”。

标签: xpath xquery exist-db


【解决方案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
    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 2015-06-30
    • 2011-11-25
    • 2021-02-25
    • 2016-12-28
    • 2018-11-21
    • 1970-01-01
    相关资源
    最近更新 更多