2016-01-31 2 views
1

Мне нужно найти ',' тексты, за которыми не следует пробел, и явно добавить значение пространства каждому из XSLT.XSLT regex - не следует

пример:

вход:

<chap> 
    <para>10,20,30,40,50,60,</para> 
    <para>10, 20, 30, 40, 50, 60</para> 
</chap> 

выход:

<chap>  
    <para>10,&#160;20,&#160;30,&#160;40,&#160;50,&#160;60,&#160;60,&#160;</para> 
    <para>10, 20, 30, 40, 50, 60</para> 
</chap> 

XSLT

<xsl:template match="text()">   
    <xsl:analyze-string select="." regex=",(?!\s)"> 
     <xsl:matching-substring> 
      <xsl:value-of select="."/> 
      <xsl:text>&#160;</xsl:text> 
     </xsl:matching-substring> 
    </xsl:analyze-string>  
</xsl:template> 

я могу использовать регулярное выражение для выполнения этой задачи, но кто-нибудь может предложить мне что как я могу плавать d ',' тексты ведьм не сопровождаются space персонажем?

+1

Вы можете разделить текст на '', ''и затем искать любые' ',' 'и добавлять' '' 'к ним – pouyan

ответ

2

Я бы

string-join(tokenize($in, ',\s*'), ', ')

Это предполагает, что было бы приемлемо для замены нескольких пробелов после запятой с одиночное пространство.

(Только что заметил, что @pouyan уже предложил этот подход в комментарии).

3

Вы можете использовать replace() функции, чтобы заменить запятую, что сопровождается не пробелом, скажет $x с запятой + &#160; + не-пробельный полукокс $x:

<xsl:template match="para"> 
    <xsl:copy> 
     <xsl:value-of select="replace(.,',(\S)',',&#160;$1')"/> 
    </xsl:copy> 
</xsl:template> 

xsltransform demo

0

Ниже приведено решение xslt-1.0 с разрешенным exslt:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:fn="http://www.w3.org/2005/xpath-functions" 
       xmlns:str="http://exslt.org/strings" 
       extension-element-prefixes="fn str"> 

    <xsl:output method="xml" version="1.0" indent="yes"/> 

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

    <xsl:template match="*"> 
     <xsl:element name="{name(.)}"> 
      <xsl:copy-of select="./@*"/> 
      <xsl:apply-templates select="./node()"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="text()"> 
     <xsl:value-of select="."/> 
    </xsl:template> 

    <xsl:template match="text()[contains(., ',')][count(str:split(., ',')) &gt; count(str:split(., ', '))]"> 
     <xsl:choose> 
      <xsl:when test="contains(., ',')"> 
       <xsl:for-each select="str:tokenize(., ', ')"> 
        <xsl:value-of select="."/> 

        <xsl:if test="position() != last()"> 
         <xsl:text>, </xsl:text> 
        </xsl:if> 
       </xsl:for-each> 
      </xsl:when> 

      <xsl:otherwise> 
       <xsl:value-of select="."/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

Последний шаблон текста соответствует только тексты, которые содержат «» не следует пространство

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