Xml xslt在2个值之间进行选择
是否可以使用xslt仅选择介于两个给定值之间的值 i、 eXml 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[. > 1 and . < 2]" 如果要包括1和2: select="value[. >= 1 and . <= 2]" 如果上限和下限在变量中(此处使用$min和$max作为示例): 与其他答案不同,我更喜欢使用标识覆盖 <?x
1
1.2
1.3
1.4
1.5
2.
2.1
2.3
2.4
2.5
我只想显示介于1和2之间的值。当然:
select="value[. > 1 and . < 2]"
如果要包括1和2:
select="value[. >= 1 and . <= 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[. < 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>
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]和。或的可能重复,或您的意思是“介于”之间,如“数值大于最小值而小于最大值”,或如“在具有一个值的元素之后,在具有不同值的另一个元素之前”?