Schematron / preceding-sibling 和 following-sibling 是同一个元素

Schematron / preceding-sibling and following-sibling are the same element

拼命想让 Schematron 仅在 EFFECT 元素位于两个 SUBTASK 元素之间时才发出警报 - 它们彼此是兄弟。非常感谢任何帮助,如果需要更多信息,请告诉我。

下面是一些简单的示例代码:

<TOPIC>
 <SUBTASK></SUBTASK>
 <EFFECT></EFFECT>
 <SUBTASK></SUBTASK>
</TOPIC>

这是我的两个 Schematron 尝试 - 问题是它对文档中的每个 EFFECT 发出警报,而不是仅在两个 SUBTASK 之间发出警报。 *注意 - EFFECT 是一个通配符,在任何地方都可以使用。

<rule context="EFFECT">
 <assert test="preceding-sibling::*[position()[1]][SUBTASK] = following-sibling::*[position()[1]][SUBTASK]" role="error" id="error_EFFECT_between_SUBTASK" 
   >EFFECT not allowed between two SUBTASKs</assert>
</rule>

<rule context="EFFECT">
 <assert test="count(preceding-sibling::*[position()>0]) and preceding-sibling::*[position()[1]][SUBTASK] = following-sibling::*[position()[1]][SUBTASK]" role="error" id="error_EFFECT_between_SUBTASKs" 
  >EFFECT not allowed between two SUBTASK</assert>
</rule>

您拥有大部分作品,但缺少 'self' 轴的 self::。尝试(未测试):

<rule context="EFFECT">
 <assert test="preceding-sibling::*[1][self::SUBTASK] and
               following-sibling::*[1][self::SUBTASK]"
         role="error" id="error_EFFECT_between_SUBTASKs" 
  >EFFECT not allowed between two SUBTASK</assert>
</rule>
如果有 SUBTASK 个子元素,

[SUBTASK] 为真,如果上下文元素为 SUBTASK.

,则不为真

[position()[1]] 可能是 XPath 1.0 的错误,但在 XPath 2.0 或 XPath 3.0 中,每次都是正确的,因为 position() returns 是一个非零数字, [1] 将单项数字序列减少到序列中的第一个(也是唯一一个)数字。