Markieren Sie mit XSLT Text, der mit Regex übereinstimmt?

Ich versuche, XSLT 2.0 (Saxon-PE 9.6) für ein HTML-Dokument zu verwenden, um Tags zu erstellen, die alle zusammenhängenden Zeichenfolgen aus einem angegebenen Nicht-Latein-Unicode-Block umgeben (Leerzeichen zulässig). Ich muss diesen Prozess auf jeden text () -Knoten im Dokument anwenden. Ich habe einige Fortschritte mit zwei Ansätzen gemacht, die @ verwend<xsl:analyze-string> und mitfn:replace() aber ich konnte keine zufriedenstellende und vollständige Lösung finden.

Hier ist zum Beispiel ein Text, der Hindi enthält:

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

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

Wie kann dieser Prozess in XSLT 2.0 implementiert werden?

Hier ist mein versuch mit<xsl:analyze-string>:

(Hinweis: Die Hindi-Sprache verwendet den Devanagari-Codeblock U + 0900 bis 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>

Am Testeingang ergibt sich:<p><span xml:lang="hi-Deva">चाय का कप</span> means ‘cup of tea’ in हिन्दि.</p> Bei diesem Ansatz fehlt die zweite Region des Hindi-Texts (हिन्हिन). Ich brauche einen Ansatz, der alle Vorkommen findet und markiert, die mit dem regulären Ausdruck übereinstimmen.

Mein zweiter Ansatz verwendetfn:replace():

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

Auf dem Testeingang erzeugt dies:<p>xxxचाय का कपxxx means ‘cup of tea’ in xxxहिन्दिxxx.</p> Dies ist eindeutig falsch, da das Hindi in xxx-Tags eingeschlossen ist, nicht in Span-Tags, aber auf der positiven Seite wird tatsächlich jede Region des Hindi entdeckt und verarbeitet. Ich kann den xxx-Code nicht durch span-Tags ersetzen, da dies ungültiges XSLT ist.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage