2016-08-26 163 views
3

我有一個示例XSL這樣,XSLT - 正則表達式替換字符

<doc> 
    <para>text . . .text</para> 
    <para>text . . .text. . . . . .text</para> 
</doc> 

正如你可以看到有在XML的一些模式,比如. . . 我需要的是替代空間點之間存在有*。所以輸出應該是什麼樣子,

<doc> 
    <para>text .*.*.text</para> 
    <para>text .*.*.text.*.*.*.*.*.text</para> 
</doc> 

我寫這下面的XSLT,

<xsl:template match="text()"> 
     <xsl:analyze-string select="." regex="(\.)(&#x0020;)(\.)"> 
      <xsl:matching-substring> 
       <xsl:value-of select="replace(.,regex-group(2),'*')"/> 
      </xsl:matching-substring> 
      <xsl:non-matching-substring> 
       <xsl:value-of select="."/> 
      </xsl:non-matching-substring> 
     </xsl:analyze-string> 
    </xsl:template> 

但它消除了所有其他的空間,給我下面的結果,

<doc> 
    <para>text .*. .text</para> 
    <para>text .*. .text.*. .*. .*.text</para> 
</doc> 

如何我可以修改我的XSLT以獲得正確的輸出...

回答

2

我認爲

<xsl:template match="text()"> 
    <xsl:analyze-string select="." regex="(\.)()(\.)(\.)*"> 
     <xsl:matching-substring> 
      <xsl:value-of select="replace(., ' ','*')"/> 
     </xsl:matching-substring> 
     <xsl:non-matching-substring> 
      <xsl:value-of select="."/> 
     </xsl:non-matching-substring> 
    </xsl:analyze-string> 
</xsl:template> 

完成這項工作。正如LukStorms指出的那樣,可以簡化爲

<xsl:template match="text()"> 
    <xsl:analyze-string select="." regex="\.(\.)+"> 
     <xsl:matching-substring> 
      <xsl:value-of select="replace(., ' ','*')"/> 
     </xsl:matching-substring> 
     <xsl:non-matching-substring> 
      <xsl:value-of select="."/> 
     </xsl:non-matching-substring> 
    </xsl:analyze-string> 
</xsl:template> 
+0

不錯。 :)我認爲這個正則表達式可以簡化爲'「\。(\。)+」' – LukStorms

+0

@LukStorms,你說得對,我已經添加了你的建議。 –

+0

我認爲那些是橢圓點,最小的三個點必須。 (\。)()(\。)(\。)* to(\。)()(\。)(\。)+ is ok。 文本。 .text不應該*之間。 –