2016-04-30 40 views
2

我有这样的X XML识别模式替换文本节点,XSLT - 通过使用正则表达式

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

什么如果,“小数”,“双师型”后面加一个空格我的目标“号”(”' )后跟一个数字,那么中间的空格值应该被*字符替换。

所以输出应该是,

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

我有以下的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> 

但它不返回正确的结果..

任何建议,我怎么能修改我的代码以获得正确的输出?

+0

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

回答

4

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

它应该是\s\d

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

你也失去了p元素。

我建议稍微简单的正则表达式,并添加xsl:copy保持p ...

XSLT 2.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> 
2

简单多了和更短的

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