2016-06-11 32 views
0

我有類似下面的大量HTML文件:XSLT連接文本

<html> 
    <head> 
    <title>t</title> 
    </head> 
    <body> 
    <div class="a"> 
     <div class="b" type="t1"> 
     b11<div class="x">x</div> 
     b12<div class="y">y</div>b13 
     </div> 
     <div class="c">c</div> 
    </div> 
    <div class="b" type="t2" region="r">b21 
     <div class="x">x</div>b22 
     <div class="y">y</div> 
     b23 
    </div> 
    </body> 
</html> 

目前本作的div類=「b」的文開頭是支離破碎的,中間和結尾的節點。 我想合併div class =「b」的文本,以便它出現在開頭。 文件我想獲得是這樣的:

<html> 
    <head> 
    <title>t</title> 
    </head> 
    <body> 
    <div class="a"> 
     <div class="b" type="t1">b11 b12 b13 
     <div class="x">x</div> 
     <div class="y">y</div> 
     </div> 
     <div class="c">c</div> 
    </div> 
    <div class="b" type="t2" region="r">b21 b22 b23 
     <div class="x">x</div> 
     <div class="y">y</div> 
    </div> 
    </body> 
</html> 

我運行下面的bash腳本a.sh:

xsltproc a.xslt a.html > b.html 

其中a.xslt如下:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="//div[@class='b']"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    <xsl:for-each select="text()"> 
    <xsl:if test="position() &gt; 1"><xsl:text> </xsl:text></xsl:if> 
    <xsl:value-of select="normalize-space(.)"/> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

不幸的是我的輸出不是我想要的:

<html> 
    <head> 
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" /> 
    <title>t</title> 
    </head> 
    <body> 
    <div class="a"> 
     <div class="b" type="t1">b11 
     <div class="x">x</div> 
     b12 
     <div class="y">y</div> 
     b13</div> 
     b11 b12 b13 
     <div class="c">c</div> 
    </div> 
    <div class="b" region="r" type="t2">b21 
     <div class="x">x</div> 
     b22 
     <div class="y">y</div> 
     b23</div> 
    <p>b21 b22 b23</p> 
    </body> 
</html> 

對於如何繼續操作,您有什麼建議嗎?

回答

1

請問這是否適合您?

<xsl:template match="div[@class='b']"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:for-each select="text()"> 
      <xsl:if test="position() &gt; 1"> 
       <xsl:text> </xsl:text> 
      </xsl:if> 
      <xsl:value-of select="normalize-space(.)"/> 
     </xsl:for-each> 
     <xsl:apply-templates select="*"/> 
    </xsl:copy> 
</xsl:template> 
+0

謝謝邁克爾。這樣可行。然而,我對'xsl:copy'裏面的最後一行有點不確定。第一行包含'select =「@ *」',即'div class =「b」'的所有屬性。中間的for-each塊獲得所有文本節點。最後一行包含'select =「*」',''*「'本身是什麼意思?它與'node()'相同嗎? – Yalmar

+1

@Yalmar'@ *'=任何屬性; '*'=任何元素; 'node()'=任何元素,文本節點,註釋或處理指令。 https://www.w3.org/TR/xpath/#node-tests –

+0

謝謝邁克爾 – Yalmar