是否可以使用 xslt 仅选择介于 2 个给定值之间的那些值?
IE
<value>1</value>
<value>1.2</value>
<value>1.3</value>
<value>1.4</value>
<value>1.5</value>
<value>2</value>
<value>2.1</value>
<value>2.3</value>
<value>2.4</value>
<value>2.5</value>
我只想显示 1 到 2 之间的值。
当然:
select="value[. > 1 and . < 2]"
如果要包括 1 和 2:
select="value[. >= 1 and . <= 2]"
如果上限和下限在变量中(此处使用 $min 和 $max 作为示例):
select="value[. > $min and . < $max]"
与其他答案不同,我更喜欢使用身份覆盖
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="value[. < 1 or . > 2]"/>
</xsl:stylesheet>
输出:
<root>
<value>1</value>
<value>1.2</value>
<value>1.3</value>
<value>1.4</value>
<value>1.5</value>
<value>2</value>
</root>
如果对值进行了排序(如在提供的 XML 文档中),这会更快——尤其是在valu
最后一个想要的元素后面有很多元素value
的情况下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<xsl:variable name="vStart" select=
"(*[.>=1][1]
|
*[1]
)
[last()]
"/>
<xsl:variable name="vEnd" select=
"($vStart/following-sibling::*[. > 2][1]
/preceding-sibling::*[1]
|
*[last()]
)
[1]
"/>
<xsl:variable name="vPosRange" select=
"count($vEnd/preceding-sibling::*) - count($vStart/preceding-sibling::*)"/>
<xsl:copy-of select=
"$vStart|$vStart/following-sibling::*[not(position() > $vPosRange)]"/>
</xsl:template>
</xsl:stylesheet>
应用于提供的 XML 文档时:
<t>
<value>1</value>
<value>1.2</value>
<value>1.3</value>
<value>1.4</value>
<value>1.5</value>
<value>2</value>
<value>2.1</value>
<value>2.3</value>
<value>2.4</value>
<value>2.5</value>
</t>
产生了想要的正确结果:
<value>1</value>
<value>1.2</value>
<value>1.3</value>
<value>1.4</value>
<value>1.5</value>
<value>2</value>
请注意:
在实践中,这为我们提供了一个纯 XPath 1.0 解决方案,我们可以用它们定义的 XPath 表达式进行$vPosRange
替换$vStart
。$vEnd