在Schematron规则中,如何访问当前元素的父元素?

时间:2011-04-11 14:08:08

标签: xml xpath schematron

我正在使用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”元素作为'Name'元素的子元素“。相反,它实际上显示“The”br“元素不允许作为'Alan Smith'元素的子元素”。那么<iso:value-of select=".."/>表达式实际上是按照我的预期选择文本节点而不是父元素?有人可以帮助解释我应该在select语句中使用什么XPpath表达式来显示我的错误消息中的父元素的名称?感谢。

更新:我设法通过删除select语句并将其替换为名称元素来实现所需的结果,如下所示:

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

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

2 个答案:

答案 0 :(得分:1)

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

  

value-of元素

     

查找或计算来自的值   实例文档允许更清楚   断言和诊断。该   必需的select属性是   表达在当前评估   返回字符串的上下文。

     

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

     

没有的实现   报告自然语言断言是   不要求使用这个   元件。

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

name(..)

答案 1 :(得分:1)

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