我正在尝试构建一个 Schematron,对 HTML/XML 文档中的段落进行非常简单的检查以查找“禁止术语”,并建议相应的“首选术语”。
示例文档片段:
<p>A sentence containing the word Autobahn.</p>
<p>A sentence containing the word client.</p>
<p>A sentence containing the word newbie.</p>
我的 Schematron 模式如下所示:
<sch:pattern id="termChecker">
<sch:let name="termPairs" value="(
('Autobahn', 'highway'),
('client', 'customer'),
('newbie', 'Beginner')
)" />
<sch:rule context="//p">
<sch:let name="foundForbidden" value="(for $pair in $termPairs return if (contains(current(), $pair[1])) then $pair[1] else ())[1]" />
<sch:let name="foundRecommended" value="(for $pair in $termPairs return if ($pair[1] = $foundForbidden) then $pair[2] else ())[1]" />
<sch:report role="info" test="$foundForbidden">
Warning: This text contains the forbidden word “<sch:value-of select='$foundForbidden'/>”.
Alternative: “<sch:value-of select='$foundRecommended'/>”.
</sch:report>
</sch:rule>
</sch:pattern>
它“几乎”有效,我收到三个消息:
Info: This text contains the forbidden word “Autobahn”. Alternative: “”.
Info: This text contains the forbidden word “client”. Alternative: “”.
Info: This text contains the forbidden word “Newbie”. Alternative: “”.
因此,它完美地找到了“禁止术语”并将其返回到消息 ( <sch:value-of select='$foundForbidden'/>
) 中。
然而,“首选术语”( <sch:value-of select='$foundRecommended'/>
) 始终保持为空。
我还尝试了几种替代方法,例如使用索引访问:
<sch:value-of select="(for $i in 1 to count($termPairs) return if (contains(current(), $termPairs[$i][1])) then $termPairs[$i][2] else ())[1]"/>
或这个:
<sch:value-of select="(for $pair in $termPairs return if (contains(current(), $pair[1])) then $pair[2] else ())[1]"/>
但我就是无法让它运行。
我在 oXygen (23.1) 中进行了尝试,其中 ISO Schematron 配置为支持 XSLT2(也测试了 XSLT3),并且还测试了配置为支持 XSLT 2 的 Schematron 1.5(也测试了 XSLT 3.1)。我还尝试使用 ph-schematron 和 ph-schematron-xslt 模块,但结果完全相同。$pair[1]
由于某种原因, $termPairs 的结构作为对的序列,以及我访问这些对 ( , )的方式$pair[2]
仅适用于$pair[1]
但不适用于$pair[2]
。
有人有想法吗?
如果您想使用“平面”序列但认为它是成对构建的,那么以下可能会这样做:
地图作为替代方案:
数组的数组(每对两个项目)将是