首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT -通过使用regex标识模式来替换文本节点。

XSLT -通过使用regex标识模式来替换文本节点。
EN

Stack Overflow用户
提问于 2016-04-30 02:21:52
回答 2查看 1.1K关注 0票数 2

我有这样的xml,

代码语言:javascript
复制
<doc>
<p>ABC Number 132, Decimal 321, AAB Double 983 DEF GHI 432 JKL</p>
</doc>

我的目标是,如果' number ','Decimal','Double‘后面跟着一个空格(’'),后面跟着一个数字,那么这个中间空格值应该替换为*字符。

所以输出应该是,

代码语言:javascript
复制
<doc>
    <p>ABC Number*132, Decimal*321, AAB Double*983 DEF GHI 432 JKL</p>
</doc>

我有后续的xsl,

代码语言:javascript
复制
<xsl:template match="p">
        <xsl:analyze-string select="text()" regex="(Number/s/d)|(Decimal/s/d)|(Double/s/d)">
            <xsl:matching-substring>
                <xsl:choose>
                    <xsl:when test="regex-group(1)">
                        <xsl:value-of select="'Number*'"/>
                    </xsl:when>
                    <xsl:when test="regex-group(2)">
                        <xsl:value-of select="'Decimal*'"/>
                    </xsl:when>
                    <xsl:when test="regex-group(3)">
                        <xsl:value-of select="'Double*'"/>
                    </xsl:when>
                </xsl:choose>
            </xsl:matching-substring>

            <xsl:non-matching-substring>
                <xsl:value-of select="."/>
            </xsl:non-matching-substring>
        </xsl:analyze-string>
    </xsl:template>

但是它没有返回正确的结果。

有什么建议吗?如何修改我的代码以获得正确的输出?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-30 03:46:09

正则表达式中的主要问题是,您正在尝试将空间和数字与/s/d匹配。

应该是\s\d

然而,即使你修复了这个问题,你仍然会失去数字,因为你没有捕捉它。

您还会丢失p元素。

我建议使用一个简单的正则表达式,并添加xsl:copy以保留p.

XSLT2.0

代码语言:javascript
复制
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="p">
    <xsl:copy>
      <xsl:analyze-string select="." regex="(Number|Decimal|Double)\s(\d)">
        <xsl:matching-substring>
          <xsl:value-of select="concat(regex-group(1),'*',regex-group(2))"/>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
          <xsl:value-of select="."/>
        </xsl:non-matching-substring>
      </xsl:analyze-string>      
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

输出

代码语言:javascript
复制
<doc>
   <p>ABC Number*132, Decimal*321, AAB Double*983 DEF GHI 432 JKL</p>
</doc>
票数 5
EN

Stack Overflow用户

发布于 2016-05-01 18:20:56

更简单更短的

代码语言:javascript
复制
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="p/text()">
    <xsl:value-of select="replace(., '(Number|Decimal|Double) (\d+)', '$1*$2')"/>
  </xsl:template>
</xsl:stylesheet>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36950000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档