如何保留最大值元素

时间:2014-11-15 11:33:55

标签: xslt

建议如何仅保留最大值元素。我使用xsl使用静态比较方法:if,是否还有其他方法可以做。我编写了一些变量来存储值,这些是我的实时项目中需要的。请建议。

输入XML:

<article>

<math>
    <mi>2</mi>
    <mi>3</mi>
</math>

<math>
    <mi>3</mi>
    <mi>2</mi>
    <mi>3</mi>
</math>

<math>
    <mi>3</mi>
    <mi>3</mi>
    <mi>2</mi>
</math>

<math>
    <mi>3</mi>
    <mi>3</mi>
    <mi>3</mi>
</math>

<math>
    <mi>5</mi>
    <mi>5</mi>
    <mi>3</mi>
</math>

<math>
    <mi>3</mi>
    <mi>5</mi>
    <mi>5</mi>
</math>

<math>
    <mi>5</mi>
    <mi>3</mi>
    <mi>5</mi>
</math>

<math>
    <mi>5</mi>
    <mi>1</mi>
    <mi>2</mi>
</math>

<math>
    <mi>5</mi>
    <mi>3</mi>
    <mi>3</mi>
</math>

</article>

XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>

<xsl:template match="mi">
    <xsl:variable name="var1" select="following::text()[normalize-space(.)!=''][1][generate-id(ancestor::math)=generate-id(current()/ancestor::math)]"/>
    <xsl:variable name="var2" select="preceding::text()[normalize-space(.)!=''][1][generate-id(ancestor::math)=generate-id(current()/ancestor::math)]"/>
    <xsl:variable name="var1a" select="following::text()[normalize-space(.)!=''][2][generate-id(ancestor::math)=generate-id(current()/ancestor::math)]"/>
    <xsl:variable name="var2a" select="preceding::text()[normalize-space(.)!=''][2][generate-id(ancestor::math)=generate-id(current()/ancestor::math)]"/>

    <xsl:choose>
        <xsl:when test="$vPresent lt $var1 or $vPresent lt $var1a">
            <xsl:comment><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy></xsl:comment>
        </xsl:when>
        <xsl:when test="$vPresent lt $var2 or $vPresent lt $var2a">
            <xsl:comment><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy></xsl:comment>
        </xsl:when>
        <xsl:when test="$vPresent eq $var2 and $vPresent eq $var1a">
            <xsl:comment><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy></xsl:comment>
        </xsl:when>
        <xsl:when test="not($vPresent eq $var2) and $vPresent eq $var1">
            <xsl:comment><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy></xsl:comment>
        </xsl:when>

        <xsl:otherwise><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy></xsl:otherwise>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>

必需的OutPut:

<article>
<math>
    <!--2-->
    <mi>3</mi>
</math>

<math>
    <!--3-->
    <!--2-->
    <mi>3</mi>
</math>

<math>
    <mi>3</mi>
    <!--3-->
    <!--2-->
</math>

<math>
    <!--3-->
    <!--3-->
    <mi>3</mi>
</math>

<math>
    <!--5-->
    <mi>5</mi>
    <!--3-->
</math>

<math>
    <!--3-->
    <!--5-->
    <mi>5</mi>
</math>

<math>
    <!--5-->
    <!--3-->
    <mi>5</mi>
</math>

<math>
    <mi>5</mi>
    <!--1-->
    <!--2-->
</math>

<math>
    <mi>5</mi>
    <!--3-->
    <!--3-->
</math>

</article>

1 个答案:

答案 0 :(得分:1)

怎么样:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="article"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="mi[.=max(../mi)][last()]">
    <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="mi">
    <xsl:comment>
        <xsl:apply-templates/>
    </xsl:comment>
</xsl:template>

</xsl:stylesheet>