xslt匹配动态模板

时间:2012-06-14 13:17:53

标签: xslt matching

我遇到了一个似乎无法解决的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>

提前致谢

2 个答案:

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