0

我遇到了一个似乎无法解决的 xslt 问题。现在我有这个模板匹配:<xsl:template match="bodytext/p[position() = 4]">

这很好用。当第 4 段呈现时,我包含了一些内容。问题是有时<p>元素可以有一个类class="exclude"

我正在尝试找到一种排除<p>具有该类属性的标签的好方法。问题在于,<p class="exclude">在第 4 段之前或第 4 段之前或在第 4 段之前可能有尽可能多的需要/需要,同时仍然呈现没有“排除”类的第 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>

提前致谢

4

2 回答 2

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>
于 2012-06-14T13:26:56.113 回答
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>
于 2012-06-14T13:49:28.510 回答