【问题标题】:In a Schematron rule, how do i access the parent element of the current element?在 Schematron 规则中,我如何访问当前元素的父元素?
【发布时间】:2011-04-11 14:08:08
【问题描述】:

我正在使用 ISO Schematron 验证 XML 文档。我设置的规则按要求工作,但我想从触发我的断言的上下文中报告父元素的名称。示例文档可能包含 XML 片段:

<Name>Alan Smith<br/></Name>

我的 Schematron 规则测试 <br/> 元素只允许作为 <title> 元素的子元素出现。规则如下:

<rule context="br">
    <assert test="parent::title"
     >The "br" element is not allowed as a child of the '<iso:value-of select=".."/>' element.'</assert>
</rule>

当我对片段运行此规则时,断言被正确触发,但是我希望消息告诉我“不允许将“br”元素作为“名称”元素的子元素”。相反,它实际上显示“不允许将“br”元素作为 'Alan Smith' 元素的子元素”。所以&lt;iso:value-of select=".."/&gt; 表达式实际上是在选择文本节点而不是我预期的父元素?有人可以帮助解释我应该在 select 语句中使用什么 XPpath 表达式来在我的错误消息中显示父元素的名称吗?谢谢。

更新:我设法通过删除 select 语句并用 name 元素替换它来实现所需的结果,如下所示:

<rule context="br">
    <assert test="parent::title"
     >The "br" element is not allowed as a child of the '<name path=".."/>' element.'</assert>
</rule>

所以我的问题解决了,但如果有人能解释为什么我的第一次尝试不起作用,那将非常有帮助。

【问题讨论】:

    标签: xml xpath schematron


    【解决方案1】:

    这就是value-of 元素的工作原理。来自http://www.schematron.com/iso/P8.html#GEN16

    value-of元素

    从 实例文档以允许更清晰 断言和诊断。这 必需的 select 属性是 在当前计算的表达式 返回字符串的上下文。

    select 中的变量引用 属性在范围内解析 当前的模式、阶段、模式和 规则。

    一个没有 报告自然语言断言是 不需要使用这个 元素。

    您可以使用此 XPath 表达式获取上下文节点的父节点的名称。

    name(..)
    

    【讨论】:

    • 感谢 Alejandro,现在说得通了,线索在函数 'value-of' 的名称中,它提供了 xpath 节点 ".." 的值!
    • @tony_h:不客气。与 XSLT 中一样,“值”表示字符串值。
    【解决方案2】:

    我相信由于 'iso:' 前缀,tony_h 的原始解决方案不起作用。由于其余代码不共享命名空间。 省略那部分可以解决问题。

    【讨论】:

    • 问题中OP提供的描述表明&lt;iso:value-of...&gt;被解释为Schematron规范定义的value-of元素。它确实提供了应有的输出,这不是 OP 想要的。看到 iso:value-of 完全按照 schematron 指定的方式进行操作,iso 前缀很可能映射到与默认(无前缀)相同的命名空间,这在 XML 中完全有效。公认的答案就是解决方案。问题中提供的信息不支持此处的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2023-03-11
    相关资源
    最近更新 更多