Использовать 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*.*?)([&#x0900;-&#x097f;]+)((\s+[&#x0900;-&#x097f;]+)*)(\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(., "[&#x0900;-&#x097f;]+(\s+[&#x0900;-&#x097f;]+)*", "xxx$0xxx")'/>
</xsl:template>

На тестовом входе это производит:<p>xxxचाय का कपxxx means ‘cup of tea’ in xxxहिन्दिxxx.</p> Это явно неверно, поскольку хинди заключен в теги xxx, а не в span, но с другой стороны, каждый регион хинди фактически обнаруживается и обрабатывается. Я не могу заменить код xxx на теги span, потому что это недопустимый XSLT.

Ответы на вопрос(3)

Ваш ответ на вопрос