xslt将1个html拆分为n html

时间:2016-03-15 16:24:05

标签: xslt xslt-1.0

我有大量文件,其结构类似于以下a.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 class =“c”的数量是已知的单位数整数,在这种情况下它等于2.

我想生成文件a_1.html和a_2.html,其中每个文件分别包含div class =“c”的第1和第2次出现。

在此示例中,我想生成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不会仅提取div class =“c”的第i个(在本例中为第一个或第二个)。

<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>

我如何修改它以获得正确的结果?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>
相关问题