Xml XSLT-通过使用正则表达式标识模式来替换文本节点

Xml XSLT-通过使用正则表达式标识模式来替换文本节点,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我有这样的x xml <doc> <p>ABC Number 132, Decimal 321, AAB Double 983 DEF GHI 432 JKL</p> </doc> ABC编号132,十进制321,AAB双983 DEF GHI 432 JKL 我的目标是,如果“Number”、“Decimal”、“Double”后面跟一个空格(“”),后面跟一个数字,那么中间的空格值应该替换为*字符 所以输出应该是, <doc>

我有这样的x xml

<doc>
<p>ABC Number 132, Decimal 321, AAB Double 983 DEF GHI 432 JKL</p>
</doc>

ABC编号132,十进制321,AAB双983 DEF GHI 432 JKL

我的目标是,如果“Number”、“Decimal”、“Double”后面跟一个空格(“”),后面跟一个数字,那么中间的空格值应该替换为*字符

所以输出应该是,

<doc>
    <p>ABC Number*132, Decimal*321, AAB Double*983 DEF GHI 432 JKL</p>
</doc>

ABC编号*132,十进制*321,AAB双精度*983 DEF GHI 432 JKL

我有以下xsl用于此

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

但它不会返回正确的结果


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

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

它应该是
\s
\d

但是,即使您修复了这个问题,您仍然会丢失数字,因为您没有捕获它

您还将丢失
p
元素

我建议使用更简单的正则表达式并添加
xsl:copy
,以保持
p

XSLT2.0

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

输出

<doc>
   <p>ABC Number*132, Decimal*321, AAB Double*983 DEF GHI 432 JKL</p>
</doc>

ABC编号*132,十进制*321,AAB双精度*983 DEF GHI 432 JKL


更加简单和简短

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

它返回什么结果?总是告诉我们什么不起作用。“它不起作用”是不够的。