xslt在2个值之间选择

时间:2013-01-04 17:10:50

标签: xml xslt xpath

是否可以使用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之间的值。

3 个答案:

答案 0 :(得分:1)

当然:

select="value[. &gt; 1 and . &lt; 2]"

如果你想包括1和2:

select="value[. &gt;= 1 and . &lt;= 2]"

如果顶部和底部限制在变量中(使用$ min和$ max作为示例):

select="value[. &gt; $min and . &lt; $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[. &lt; 1 or . &gt; 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表达式用。