创建一个 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 的语言绑定。)
我正在尝试创建一个 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 的语言绑定。)