Use XSLT para marcar regex de correspondência de texto?

Estou tentando usar o XSLT 2.0 (Saxon-PE 9.6) em um documento HTML para criar tags que envolvam todas as execuções contíguas de caracteres de um bloco Unicode não latino especificado (espaços permitidos). Eu preciso aplicar esse processo a todos os nós text () do documento. Eu fiz alguns progressos com duas abordagens que usam<xsl:analyze-string> e usandofn:replace() mas não consegui chegar a uma solução satisfatória e completa.

Por exemplo, aqui está um texto que contém hindi:

Entrada:<p>चाय का कप means ‘cup of tea’ in हिन्दि.</p>

Saída desejada:<p><span xml:lang="hi-Deva">चाय का कप</span> means ‘cup of tea’ in <span xml:lang="hi-Deva">हिन्दि</span>.</p>

Como esse processo pode ser implementado no XSLT 2.0?

Aqui está minha tentativa com<xsl:analyze-string>:

(Nota: o idioma hindi usa o bloco de códigos Devanagari U + 0900 a 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>

Na entrada de teste, isso produz:<p><span xml:lang="hi-Deva">चाय का कप</span> means ‘cup of tea’ in हिन्दि.</p> Essa abordagem perde a segunda região do texto em hindi (हिन्दि). Eu preciso de uma abordagem que encontre e marque todas as ocorrências correspondidas pelo regex.

Minha segunda abordagem usadafn:replace():

<xsl:template match="text()">
  <xsl:value-of select='fn:replace(., "[&#x0900;-&#x097f;]+(\s+[&#x0900;-&#x097f;]+)*", "xxx$0xxx")'/>
</xsl:template>

Na entrada de teste, isso produz:<p>xxxचाय का कपxxx means ‘cup of tea’ in xxxहिन्दिxxx.</p> Isso está claramente incorreto, já que o hindi está envolto em tags de xxx, não em span, mas no lado positivo, cada região do hindi é de fato descoberta e processada. Não consigo substituir o código xxx por tags de extensão porque esse é um XSLT inválido.

questionAnswers(3)

yourAnswerToTheQuestion