XSLT 将 1 个 HTML 拆分为 N 个 HTML



我有大量结构如下的文件.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" 的第一次和第二次出现。

在此示例中,我想生成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>

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

提前感谢您的帮助。

如果您需要保持当前的方法,则只需更改对select="div[@class='c']的调用。
自:

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

但请注意:属性 (@*) 在apply-templates之前<xsl:apply-templates select="div[@class='a']" />是错误的。因此,请尝试:

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

使用

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

相关内容

  • 没有找到相关文章

最新更新