2015-09-01 74 views
2

添加新節點我有一個XML像下面,XSLT - 通過分析文本節點

<doc> 
    <chap> 
     The bowler delivers the ball 
     to the batsman who attempts to 
     hit the ball with his bat away from 
     the fielders so he can run to the 
     other end of the pitch and score a run. 
    </chap> 
</doc> 

我的要求是添加一個名爲<p><chap>文本節點,在添加<p>節點到每個新行的新節點。

因此,所需的輸出,

<doc> 
    <chap> 
     <p>The bowler delivers the ball</p> 
     <p>to the batsman who attempts to</p> 
     <p>hit the ball with his bat away from</p> 
     <p>the fielders so he can run to the</p> 
     <p>other end of the pitch and score a run.</p> 
    </chap> 
</doc> 

你能給我一個建議,我該怎麼使用正則表達式爲此在XSLT和換行符(#xA)與文本分離。

我試圖做這個任務,但想不到一種方法來做到這一點。

回答

2

你可以使用xsl:analyze-string選擇空格和換行之間的文本:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 
    <xsl:output indent="yes"/> 

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

    <xsl:template match="chap/text()"> 
     <xsl:analyze-string select="." regex="\s*(.*)\n"> 
      <xsl:matching-substring> 
       <p><xsl:sequence select="regex-group(1)"/></p> 
      </xsl:matching-substring> 
     </xsl:analyze-string> 
    </xsl:template> 

</xsl:stylesheet> 

或者你可以使用tokenize()對換行拆分

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 
    <xsl:output indent="yes"/> 

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

    <xsl:template match="chap/text()"> 
     <xsl:for-each select="tokenize(., '\n')[normalize-space()]"> 
      <p><xsl:sequence select="normalize-space()"/></p> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 
+0

感謝您的解決方案。這工作完美。 +1 – sanjay