3

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

4

3 回答 3

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]"
于 2013-01-04T18:05:52.697 回答
1

与其他答案不同,我更喜欢使用身份覆盖

<?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>
于 2013-01-04T18:27:34.953 回答
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 解决方案,我们可以用它们定义的 XPath 表达式进行$vPosRange替换$vStart$vEnd

于 2013-01-05T04:18:39.597 回答