2015-11-17 4 views
0

У меня есть XML, как это,XSLT - заменить конкретное содержание узла текста() с новым узлом

<doc> 
    <p>Biological<sub>89</sub> bases<sub>4456</sub> for<sub>8910</sub> sexual<sub>4456</sub> 
      differences<sub>8910</sub> in<sub>4456</sub> the brain exist in a wide range of 
     vertebrate species, including chickens<sub>8910</sub> Recently<sub>8910</sub> the 
      dogma<sub>8910</sub> of<sub>4456</sub> hormonal dependence for the sexual 
     differentiation of the brain has been challenged.</p> 
</doc> 

Как вы можете видеть, что есть <sub> узлы и text() узел содержит внутри <p> узла. и каждый конец <sub>, есть текстовый узел, начиная с пробела. (например: <sub>89</sub> bases: здесь перед появлением текста «основания» существует пространство.) Мне нужно заменить эти конкретные пространства узлами.

SO ожидаемый результат должен выглядеть следующим образом,

<doc> 
    <p>Biological<sub>89</sub><s/>bases<sub>4456</sub><s/>for<sub>8910</sub><s/>sexual<sub>4456</sub> 
     <s/>differences<sub>8910</sub><s/>in<sub>4456</sub><s/>the brain exist in a wide range of 
     vertebrate species, including chickens<sub>8910</sub><s/>Recently<sub>8910</sub><s/>the 
     dogma<sub>8910</sub><s/>of<sub>4456</sub><s/>hormonal dependence for the sexual 
     differentiation of the brain has been challenged.</p> 
</doc> 

, чтобы сделать это, я могу использовать регулярные выражения, как это,

<xsl:template match="p/text()"> 
     <xsl:analyze-string select="." regex="(&#x20;)"> 
      <xsl:matching-substring> 
       <xsl:choose> 
        <xsl:when test="regex-group(1)"> 
         <s/> 
        </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/> узлов в каждое пространство в тексте (). Но мне нужно только добавить узлы к этим конкретным пространствам.

Может кто-нибудь предложить мне способ, как я могу это сделать ..

ответ

2

Если вы хотите, чтобы соответствовать текстовые узлы, которые начинаются с пробела и предваряются sub элементом , вы можете поместить условие в свой шаблон матча

<xsl:template match="p/text()[substring(., 1, 1) = ' '][preceding-sibling::node()[1][self::sub]]"> 

И если вы просто хотите t o удалите пробел в начале строки, просто замените.

<xsl:value-of select="replace(., '^\s+', '')" /> 

Попробуйте XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="no" /> 

    <xsl:template match="p/text()[substring(., 1, 1) = ' '][preceding-sibling::node()[1][self::sub]]"> 
     <s /> 
     <xsl:value-of select="replace(., '^\s+', '')" /> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
1

Просто изменить регулярное выражение, как так ^(&#x20;): он будет соответствовать только пробелы в начале текстовой части.

С этим XSL отрезала:

<xsl:analyze-string select="." regex="^(&#x20;)"> 

Вот результат я получаю:

<p>Biological<sub>89</sub><s></s>bases<sub>4456</sub><s></s>for<sub>8910</sub><s></s>sexual<sub>4456</sub> 
     differences<sub>8910</sub><s></s>in<sub>4456</sub><s></s>the brain exist in a wide range of 
     vertebrate species, including chickens<sub>8910</sub><s></s>Recently<sub>8910</sub><s></s>the 
     dogma<sub>8910</sub><s></s>of<sub>4456</sub><s></s>hormonal dependence for the sexual 
     differentiation of the brain has been challenged. 
     </p> 
Смежные вопросы