创建一个 schematron 来检查 fig 元素不要被包裹在 P 元素中

Create a schematron to check for fig elements NOT to be wrapped in P elements

我正在尝试创建一个 schematron,它将指出 fig 元素环绕 p 元素的位置。我更喜欢让 p 元素结束,然后 fig 元素开始。

我找到了一个模板来确保 fig 被 p 元素包裹,但我不知道如何更改它以使其相反。

这是模板:

<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron"
queryBinding="xslt2">
  <sch:pattern>
      <sch:rule context="*[contains(@class, ' topic/fig ') and not(contains(@class, ' topic/fig 
   ut-d/imagemap '))]" role="warn">
      <sch:let name="precedingText" value="preceding-sibling::text()"/>
      <sch:let name="followingText" value="following-sibling::text()"/>
      <sch:assert test=".[parent::p][count(parent::node()/child::*) = 1]
          [not($precedingText) or $precedingText[normalize-space()='']]
          [not($followingText) or $followingText[normalize-space()='']]" >
          The fig element should be wrapped in a paragraph.</sch:assert>
      </sch:rule>
  </sch:pattern>
</sch:schema>

如果您将 sch:assert 更改为 sch:report,您将得到反向检查。或者在@test 属性的整个 XPath 值周围添加 not() 函数。

也许规则应该是这样的:

<sch:pattern>
<sch:rule
    context="*[contains(@class, ' topic/p ')]/*[contains(@class, ' topic/fig ') and not(contains(@class, ' topic/fig ut-d/imagemap '))]">
    <sch:report test="true()" role="warn">The fig element should NOT be wrapped in a
        paragraph.</sch:report>
</sch:rule></sch:pattern>

我在规则中忽略了 fig 元素之前和之后的文本部分。我不确定这对你的情况是否重要。

你可以使用这个:

<sch:pattern>
  <sch:rule context="*[contains(@class, 'topic/fig')]
                      [not(contains(@class, 'topic/fig ut-d/imagemap'))]"
            role="warn">
    <sch:assert test="not(parent::p)">Figures should be outside p elements.</sch:assert>
  </sch:rule>
</sch:pattern>

如果您想要更精确地匹配@class 字符串部分,您可以尝试使用 tokenize() 函数(这是一个 XPath2 函数,因此可用于基于 XSLT2 的语言绑定。)