我遇到了一个似乎无法解决的xslt问题。现在我有这个模板匹配:<xsl:template match="bodytext/p[position() = 4]">
这很好用。当第4段呈现时,我包含一些内容。问题是有时<p>
元素可以有一个类class="exclude"
我正在尝试找到一种排除具有该class属性的<p>
标记的好方法。问题是,在第4段之前或第4段可能存在所需/需要的<p class="exclude">
次,同时仍然呈现第1段,第2段和第3段没有“排除”类。因此,如果文档如下:
<p></p>
<p class="exclude"></p>
<p class="exclude"></p>
<p class="exclude"></p>
<p></p>
<p class="exclude"></p>
<p></p>
<p></p>
我只想匹配模板:
<p></p>
<p></p>
<p></p>
<p></p>
另一个例子是输入:
<p></p>
<p></p>
<p></p>
<p class="exclude"></p>
<p class="exclude"></p>
<p class="exclude"></p>
<p class="exclude"></p>
<p class="exclude"></p>
<p class="exclude"></p>
<p></p>
和输出:
<p></p>
<p></p>
<p></p>
<p></p>
提前致谢
答案 0 :(得分:2)
你可以这样做:
<xsl:apply-templates
select="bodytext/p[not(@class = 'exclude')][position() = 4]"/>
这是测试用例。应用以下转换:
<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:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates
select="bodytext/p[not(@class = 'exclude')][position() = 4]"/>
</xsl:template>
</xsl:stylesheet>
要:
<bodytext>
<p></p>
<p class="exclude"></p>
<p class="exclude"></p>
<p class="exclude"></p>
<p></p>
<p class="exclude"></p>
<p></p>
<p>test</p>
</bodytext>
产地:
<p>test</p>
答案 1 :(得分:0)
使用
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="bodytext/p[@class = 'exclude']"/>
<xsl:template match="bodytext/p[not(@class = 'exclude')][4]">
<xsl:copy>
<!-- new content goes here -->
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>