¿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*.*?)([ऀ-ॿ]+)((\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>
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(., "[ऀ-ॿ]+(\s+[ऀ-ॿ]+)*", "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.