2

我正在使用 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' 元素的子元素”。所以<iso:value-of select=".."/>表达式实际上是选择文本节点而不是我预期的父元素?有人可以帮助解释我应该在 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>

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

4

2 回答 2

1

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

value-of元素

从实例文档中查找或计算值以允许更清晰的断言和诊断。requiredselect属性是在当前上下文中计算的返回字符串的表达式。

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

不报告自然语言断言的实现不需要使用此元素。

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

name(..)
于 2011-04-11T16:24:01.163 回答
1

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

于 2016-02-25T09:00:27.273 回答