¿Usar XSLT para marcar expresiones regulares de texto coincidentes?

Estoy tratando de usar XSLT 2.0 (Saxon-PE 9.6) en un documento HTML para crear etiquetas que rodeen todas las ejecuciones contiguas de caracteres de un bloque Unicode no latino especificado (espacios permitidos). Necesito aplicar este proceso a cada nodo text () en el documento. He progresado con dos enfoques que utilizan<xsl:analyze-string> y usandofn:replace() pero no he podido llegar a una solución satisfactoria y completa.

Por ejemplo, aquí hay un texto que contiene hindi:

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

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

¿Cómo se puede implementar este proceso en XSLT 2.0?

Aquí está mi intento con<xsl:analyze-string>:

(Nota: el idioma hindi usa el bloque de código 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>

En la entrada de prueba, esto produce:<p><span xml:lang="hi-Deva">चाय का कप</span> means ‘cup of tea’ in हिन्दि.</p> Este enfoque pierde la segunda región del texto hindi (हिन्दि). Necesito un enfoque que encuentre y etiquete todas las ocurrencias que coincidan con la expresión regular.

Mi segundo enfoque usadofn:replace():

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

En la entrada de prueba esto produce:<p>xxxचाय का कपxxx means ‘cup of tea’ in xxxहिन्दिxxx.</p> Esto es claramente incorrecto, ya que el hindi está envuelto en xxx, no en etiquetas de extensión, pero en el lado positivo, cada región del hindi se descubre y procesa. No puedo reemplazar el código xxx con etiquetas span porque eso no es válido XSLT.

Respuestas a la pregunta(3)

Su respuesta a la pregunta