建议如何仅保留最大值元素。我使用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>
答案 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>