是否可以使用xslt?
仅选择介于2个给定值之间的值即
<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之间的值。
答案 0 :(得分:1)
当然:
select="value[. > 1 and . < 2]"
如果你想包括1和2:
select="value[. >= 1 and . <= 2]"
如果顶部和底部限制在变量中(使用$ min和$ max作为示例):
select="value[. > $min and . < $max]"
答案 1 :(得分:1)
与其他答案不同,我更喜欢使用Identity Override
<?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>
答案 2 :(得分:0)
如果对值进行排序(如在提供的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解决方案,因为我们可以将$vPosRange
,$vStart
和$vEnd
替换为定义它们的XPath表达式用。