2016-03-15 103 views
0

我有大量的文件中包含以下a.html結構的恆定數量:XSLT加入兄弟姐妹

<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 class="d">ddd12 
      <div class="e">eee12</div> 
      <div class="f">fff12 
      <div class="g">ggg121</div> 
      <div class="g">ggg122</div> 
      <div class="g">ggg123</div> 
      <div class="g">ggg124</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 class="g">ggg215</div> 
      </div> 
     </div> 
     </div> 
     ... 
    </div> 
    </body> 
</html> 
  • DIV類=「C」的數是在每個文件(可變零個或多個)
  • DIV類=「d」的數量是內部的各變量(零個或多個)
  • 的DIV類=「G」的數量是內部的各變量(零個或多個)

我想在所有文件中有一個div class =「c」等於max_c參數。

我使用下面的外殼腳本傳遞max_c參數與至3個相等的一個值:

#!/bin/bash 
xsltproc --param max_c 3 a.xslt a.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:param name="max_c"/> 

<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']" /> 
    <xsl:apply-templates select="div[@class='c']" /> 
    <xsl:call-template name="AddC"> 
    <xsl:with-param name="count" select="$max_c - count(div[@class='c'])" /> 
    </xsl:call-template> 
    </xsl:copy> 
</xsl:template> 

<xsl:template name="AddC"> 
    <xsl:param name="count" /> 
    <xsl:if test="$count > 0"> 
    <div class="c">ccc 
    </div> 
    <xsl:call-template name="AddC"> 
    <xsl:with-param name="count" select="$count - 1" /> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

的輸出是下面的:

<html> 
    <body> 
    <div> 
     <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 class="d">ddd12 
      <div class="e">eee12</div> 
      <div class="f">fff12 
      <div class="g">ggg121</div> 
      <div class="g">ggg122</div> 
      <div class="g">ggg123</div> 
      <div class="g">ggg124</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 class="g">ggg215</div> 
      </div> 
     </div> 
     </div> 
     <div class="c">ccc$count</div> 
    </div> 
    </body> 
</html> 

這幾乎是我想要的,有兩個例外:

  1. 第一個div已經失去了它的類= 「a」 和它的價值AAA
  2. 增加的DIV CLASS = 「C」 應該有ccc3的價值,而不是CCC $算

什麼我做錯了嗎?

像往常一樣,我提前感謝您的幫助。

+1

請只能選擇相關的標籤。你的問題不是關於[tag:xquery],XQuery甚至不被你使用的工具支持。 –

+0

您的XSLT是否缺少某些內容,因爲它目前只輸出'ccc'而不是'ccc $ count'? –

+0

對不起,這個網站是新手,對xslt,xquery,xpath等很新。我現在纔看到你的通知。謝謝,我已注意到並仔細閱讀了我的帖子,按照要求更正了所有標籤。 – Yalmar

回答

2

第一個div已經失去了它的類=「a」和它的價值AAA
添加缺少的屬性和文本內容的改動xslt:copy類似如下:

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

@*增加所有屬性和text()全部文字內容。

增加的DIV CLASS = 「C」 應該有ccc3的價值,而不是CCC $算 改變輸出DIV C作爲:

<div class="c"> 
    ccc<xsl:value-of select="$count"/> 
</div> 
+0

謝謝!所有工作現在:) – Yalmar