У меня есть схематрон, созданный, чтобы помечать латинизмы в теме. Это работает слишком хорошо. Это также помечает слова, в которых есть эта комбинация букв. Например, ему нужно пометить «и т. д.», но он также помечает «kи т.дhup», потому что kи т.дhup имеет «и т. д.» в середине. Я не знаю, что изменить в моем коде, чтобы он помечал только фактическую латиницу, а не другие слова.
Вот мой код:
<sch:schema xmlns:sch = "http://purl.oclc.org/dsdl/schematron"
queryBinding = "xslt2">
<sch:let name = "words" value = "' i.e, etc., e.g., vs, et al, circa'"/>
<sch:let name = "wordsToMatch" value = "replace($words, ',', '|')"/>
<sch:pattern id = "LatinismsCheck">
<sch:rule context = "text()">
<sch:report test = "matches(., $wordsToMatch)" role = "warn">
The following words should not be added in the topic:
<sch:value-of select = "$words"/>
</sch:report>
</sch:rule>
</sch:pattern>
</sch:schema>
Может быть, вы можете отметить в регулярном выражении границу слова с помощью '\ b'. Что-то вроде этого:
<sch:schema xmlns:sch = "http://purl.oclc.org/dsdl/schematron"
queryBinding = "xslt2" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<sch:let name = "words" value = "'i.e.,etc.,e.g.'"/>
<sch:let name = "wordsToMatch">
<xsl:for-each select = "tokenize($words,',')">
<xsl:value-of select = "concat('(\b', normalize-space(.), ')')"/>
<xsl:if test = "position() != last()">
<xsl:value-of select = "'|'"/>
</xsl:if>
</xsl:for-each>
</sch:let>
<sch:pattern>
<sch:rule context = "text()">
<sch:report test = "matches(., string($wordsToMatch), ';j')" role = "warn">
The following words should not be added in the topic: <sch:value-of select = "$words"/>
</sch:report>
</sch:rule>
</sch:pattern></sch:schema>
StackOverflow существует, чтобы помочь вам с проблемами кодирования. Это неподходящее место для вопросов об алгоритмах, дизайне приложений или обработке естественного языка. Если вы знаете, что вы хотите, чтобы ваша программа делала, можно спросить здесь. Если нет, то нужно спросить в другом месте.