2015-11-17 104 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:此处出现'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>