Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xslt在2个值之间进行选择_Xml_Xslt_Xpath - Fatal编程技术网

Xml xslt在2个值之间进行选择

Xml xslt在2个值之间进行选择,xml,xslt,xpath,Xml,Xslt,Xpath,是否可以使用xslt仅选择介于两个给定值之间的值 i、 e 1 1.2 1.3 1.4 1.5 2. 2.1 2.3 2.4 2.5 我只想显示介于1和2之间的值。当然: select="value[. &gt; 1 and . &lt; 2]" 如果要包括1和2: select="value[. &gt;= 1 and . &lt;= 2]" 如果上限和下限在变量中(此处使用$min和$max作为示例): 与其他答案不同,我更喜欢使用标识覆盖 <?x

是否可以使用xslt仅选择介于两个给定值之间的值

i、 e

1
1.2
1.3
1.4
1.5
2.
2.1
2.3
2.4
2.5
我只想显示介于1和2之间的值。

当然:

select="value[. &gt; 1 and . &lt; 2]"
如果要包括1和2:

select="value[. &gt;= 1 and . &lt;= 2]"
如果上限和下限在变量中(此处使用$min和$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[. &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>

1.
1.2
1.3
1.4
1.5
2.

如果对值进行排序(如在提供的XML文档中),这将更快——特别是在最后一个需要的
元素之后有许多
元素的情况下:

<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>
<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>

应用于提供的XML文档时

<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>
<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>

1.
1.2
1.3
1.4
1.5
2.
2.1
2.3
2.4
2.5
生成所需的正确结果

<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>
<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>
1
1.2
1.3
1.4
1.5
2.
注意事项

<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>
<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

您使用哪种XSLT版本?在2.0中,有运算符
,因此您可以使用
//value[.>>//value[.=1]和。或的可能重复,或您的意思是“介于”之间,如“数值大于最小值而小于最大值”,或如“在具有一个值的元素之后,在具有不同值的另一个元素之前”?