我试图在 HTML文档上使用XSLT 2.0(Saxon-PE 9.6)来创建围绕指定的非拉丁语Unicode块(允许的空格)的所有连续字符行的标记.我需要将此过程应用于文档中的每个text()节点.我使用 xsl:analyze-stri
例如,这里有一些包含印地语的文字:
输入:< p>चायकाकप在हिन्दि中的意思是“一杯茶”.< / p>
期望的输出:< p>< span xml:lang =“hi-Deva”>चायकाकप< / span>是指< span xml:lang =“hi-Deva”>हिन्दि< / span>中的“一杯茶”.< / p>
如何在XSLT 2.0中实现此过程?
这是我与< xsl:analyze-string>的尝试:
(注意:印地语使用梵文代码块U 0900到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>
在测试输入上,这会产生:
< p>< span xml:lang =“hi-Deva”>चायकाकप< / span>在हिन्दि中意为“一杯茶”.< / p>这种方法错过了印地语文本的第二个区域(हिन्दि).我需要一种方法来查找和标记正则表达式匹配的所有匹配项.
我的第二种方法使用了fn:replace():
<xsl:template match="text()"> <xsl:value-of select='fn:replace(., "[ऀ-ॿ]+(\s+[ऀ-ॿ]+)*", "xxx$0xxx")'/> </xsl:template>
在测试输入上产生:< p> xxxचायकाकपxxx在xxxहिन्दिxxx中意味着’一杯茶’.< / p>这显然是不正确的,因为印地语用xxx包裹,而不是跨度标签,但从积极的一面来看,印地语的每个区域实际上都是被发现和处理的.我无法用span标签替换xxx代码,因为这是无效的XSLT.
我想出了 http://xsltransform.net/jyH9rMo<?xml version="1.0" encoding="UTF-8" ?> <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> <xsl:template match="/"> <hmtl> <head> <title>New Version!</title> </head> <xsl:apply-templates/> </hmtl> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="text()"> <xsl:analyze-string select="." regex="([ऀ-ॿ]+)((\s+[ऀ-ॿ]+)*)"> <xsl:matching-substring> <span xml:lang="hi-Deva"><xsl:value-of select="."/></span> </xsl:matching-substring> <xsl:non-matching-substring> <xsl:value-of select="."/> </xsl:non-matching-substring> </xsl:analyze-string> </xsl:template> </xsl:transform>