我有大量结构如下的文件.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>