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