加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – 使用XSLT标记匹配正则表达式的文本?

发布时间:2020-12-16 22:41:26 所属栏目:百科 来源:网络整理
导读:我试图在 HTML文档上使用XSLT 2.0(Saxon-PE 9.6)来创建围绕指定的非拉丁语Unicode块(允许的空格)的所有连续字符行的标记.我需要将此过程应用于文档中的每个text()节点.我使用 xsl:analyze-string的两种方法取得了一些进展.并使用fn:replace()但我无法达到
我试图在 HTML文档上使用XSLT 2.0(Saxon-PE 9.6)来创建围绕指定的非拉丁语Unicode块(允许的空格)的所有连续字符行的标记.我需要将此过程应用于文档中的每个text()节点.我使用< xsl:analyze-string>的两种方法取得了一些进展.并使用fn:replace()但我无法达到令人满意和完整的解决方案.

例如,这里有一些包含印地语的文字:

输入:< 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*.*?)([&#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>

在测试输入上,这会产生:
< p>< span xml:lang =“hi-Deva”>???????< / span>在??????中意为“一杯茶”.< / p>这种方法错过了印地语文本的第二个区域(??????).我需要一种方法来查找和标记正则表达式匹配的所有匹配项.

我的第二种方法使用了fn:replace():

<xsl:template match="text()">
  <xsl:value-of select='fn:replace(.,"[&#x0900;-&#x097f;]+(s+[&#x0900;-&#x097f;]+)*","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="([&#x0900;-&#x097f;]+)((s+[&#x0900;-&#x097f;]+)*)">

    <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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读