2016-03-15 60 views
-2

我有大量的文件中包含以下a.html的結構:XSLT拆分1個HTML成n HTML

<html> 
    <body> 
    <div class="a">aaa 
     <div class="b">bbb</div> 
     <div class="c">ccc1 
     <div class="d">ddd11 
      <div class="e">eee11</div> 
      <div class="f">fff11 
      <div class="g">ggg111</div> 
      <div class="g">ggg112</div> 
      <div class="g">ggg113</div> 
      <div class="g">ggg114</div> 
      <div class="g">ggg115</div> 
      <div class="g">ggg116</div> 
      </div> 
     </div> 
     </div> 
     <div class="c">ccc2 
     <div class="d">ddd21 
      <div class="e">eee21</div> 
      <div class="f">fff21 
      <div class="g">ggg211</div> 
      <div class="g">ggg212</div> 
      <div class="g">ggg213</div> 
      <div class="g">ggg214</div> 
      </div> 
     </div> 
     </div> 
    </div> 
    </body> 
</html> 

的DIV類=「c」的數目是一個已知的單位的整數,在這種情況下,它等於2.

我想生成文件a_1.html和a_2.html,其中每個文件分別包含div class =「c」的第一次和第二次出現。

在本例中,我想生成a_1.html和a_2.html如下:

a_1.html

<html> 
    <body> 
    <div class="a">aaa 
     <div class="b">bbb</div> 
     <div class="c">ccc1 
     <div class="d">ddd11 
      <div class="e">eee11</div> 
      <div class="f">fff11 
      <div class="g">ggg111</div> 
      <div class="g">ggg112</div> 
      <div class="g">ggg113</div> 
      <div class="g">ggg114</div> 
      <div class="g">ggg115</div> 
      <div class="g">ggg116</div> 
      </div> 
     </div> 
     </div> 
    </div> 
    </body> 
</html> 

a_2.html

<html> 
    <body> 
    <div class="a">aaa 
     <div class="b">bbb</div> 
     <div class="c">ccc2 
     <div class="d">ddd21 
      <div class="e">eee21</div> 
      <div class="f">fff21 
      <div class="g">ggg211</div> 
      <div class="g">ggg212</div> 
      <div class="g">ggg213</div> 
      <div class="g">ggg214</div> 
      </div> 
     </div> 
     </div> 
    </div> 
    </body> 
</html> 

我有一個shell腳本如下所示:

#!/bin/bash 
for i in {1..2} 
do 
    xsltproc --param occurrence ${i} a.xslt a.html > a_${i}.html 
done 

我a.xslt然而並不只提取第i個(第一或第二在這種情況下)的div類=「C」的發生。

<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:param name="occurrence"/> 

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

<xsl:template match="div[@class='a']"> 
    <xsl:copy> 
    <xsl:apply-templates select="div[@class='a']" /> 
    <xsl:apply-templates select="@* | div[@class='b'] | text()" /> 
    <xsl:apply-templates select="div[@class='c']" /> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

我怎麼能修改它,以獲得正確的結果呢?

預先感謝您對您有所幫助。

+0

爲什麼這個標記爲'xquery'如果你只對XSLT感興趣嗎? –

+1

-1的標籤隨之而來的誤用(我已經去掉一個[標籤:XQuery的]在幾個小時前,並留下了通知)。不要用錯了標籤,應用了錯誤的標籤警報(和苦惱)人沒有在你的問題的興趣。 –

+0

哎呀,對不起,這個網站是新手。我不知道頂欄上的通知櫃檯。現在我可以看到它。 – Yalmar

回答

2

如果你需要保持你目前的做法,你只需要改變的呼籲select="div[@class='c']
要:

<xsl:apply-templates select="div[@class='c'][position()=$occurrence]" /> 

但要注意: 的<xsl:apply-templates select="div[@class='a']" />apply-templates之前的屬性(@*)是錯誤的。爲此 嘗試:

<xsl:template match="div[@class='a']"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | div[@class='b'] | text()" /> 
     <xsl:apply-templates select="div[@class='c'][position()=$occurrence]" /> 
    </xsl:copy> 
</xsl:template> 
+0

謝謝你缺少一塊拼圖:),並感謝你的指正,這是非常讚賞(我還是通過XSLT找到我的方式) – Yalmar

2

使用

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:param name="occurrence"/> 

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

<xsl:template match="div[@class='c']"> 
    <xsl:variable name="pos"> 
    <xsl:number count="div[@class = 'c']"/> 
    </xsl:variable> 
    <xsl:if test="$pos = $occurrence"> 
    <xsl:copy-of select="."/> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 
+0

感謝您的建議Martin。我用第一個答案的建議,但我可以看到你在那裏做什麼。非常感激。 – Yalmar