2016-08-26 4 views
3

У меня есть образец XSL, как это,XSLT - Regex заменить символ

<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

Nice. :) И я думаю, что регулярное выражение можно упростить до '' \. (\.) + "' – LukStorms

+0

@LukStorms, вы правы, я добавил ваше предложение. –

+0

Я предполагаю, что это точки эллипса, минимальные три точки должны. (\.)() (\.) (\.) * to (\.)() (\.) (\.) + нормально. текст. .text не должно быть * между. –

Смежные вопросы