Использовать XSLT для разметки соответствия текста регулярному выражению?
Я пытаюсь использовать XSLT 2.0 (Saxon-PE 9.6) в документе HTML для создания тегов, которые окружают все непрерывные серии символов из указанного нелатинского блока Unicode (допускаются пробелы). Мне нужно применить этот процесс к каждому узлу text () в документе. Я добился определенного прогресса с двумя подходами, которые используют<xsl:analyze-string>
и используяfn:replace()
но я не смог прийти к удовлетворительному и полному решению.
Например, вот текст, содержащий хинди:
Входные данные:<p>चाय का कप means ‘cup of tea’ in हिन्दि.</p>
Желаемый результат:<p><span xml:lang="hi-Deva">चाय का कप</span> means ‘cup of tea’ in <span xml:lang="hi-Deva">हिन्दि</span>.</p>
Как этот процесс может быть реализован в XSLT 2.0?
Вот моя попытка с<xsl:analyze-string>
:
(Примечание: язык хинди использует кодовый блок деванагари от U + 0900 до U + 097F.)
<xsl:template match="text()">
<xsl:variable name="textValue" select="."/>
<xsl:analyze-string select="$textValue" regex="(\s*.*?)([ऀ-ॿ]+)((\s+[ऀ-ॿ]+)*)(\s*.*)">
<xsl:matching-substring>
<xsl:value-of select="regex-group(1)"/>
<span xml:lang="hi-Deva"><xsl:value-of select="regex-group(2)"/><xsl:value-of select="regex-group(3)"/></span>
<xsl:value-of select="regex-group(5)"/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="$textValue"/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
На тестовом входе это производит:<p><span xml:lang="hi-Deva">चाय का कप</span> means ‘cup of tea’ in हिन्दि.</p>
Этот подход пропускает вторую область текста на хинди (हिन्दि). Мне нужен подход, который найдет и пометит все вхождения, соответствующие регулярному выражению.
Мой второй подход использовалfn:replace()
:
<xsl:template match="text()">
<xsl:value-of select='fn:replace(., "[ऀ-ॿ]+(\s+[ऀ-ॿ]+)*", "xxx$0xxx")'/>
</xsl:template>
На тестовом входе это производит:<p>xxxचाय का कपxxx means ‘cup of tea’ in xxxहिन्दिxxx.</p>
Это явно неверно, поскольку хинди заключен в теги xxx, а не в span, но с другой стороны, каждый регион хинди фактически обнаруживается и обрабатывается. Я не могу заменить код xxx на теги span, потому что это недопустимый XSLT.