gpt4 book ai didi

XSLT 将数字作为字符串进行比较

转载 作者:行者123 更新时间:2023-12-04 11:49:34 26 4
gpt4 key购买 nike

背景

我最近惊讶地发现 XSL 能够智能地处理数字;即知道在执行比较时将文本中的数字视为数字(即理解 7 < 10 而不是思考 '10' < '7' )。就我而言,这就是我想要的;只是不是我所期望的。

出于好奇,我然后尝试强制 XSLT 将数字作为字符串进行比较(即通过使用 string() 函数,但没有运气。

问题

是否可以让 XSLT 将数字作为字符串进行比较;例如所以'10' < '7' ?

示例

源 XML:

<?xml version="1.0" encoding="utf-8"?>
<element>
<x>1</x>
<x>2</x>
<x>3</x>
<x>4</x>
<x>5</x>
<x>6</x>
<x>7</x>
<x>8</x>
<x>9</x>
<x>10</x>
</element>

XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="element">
<element>

<AsItComes>
<xsl:for-each select="./x">
<xsl:if test="./text() &lt; 7">
<xsl:copy-of select="."></xsl:copy-of>
</xsl:if>
</xsl:for-each>
</AsItComes>

<AsNumber>
<xsl:for-each select="./x">
<xsl:if test="number(./text()) &lt; 7">
<xsl:copy-of select="."></xsl:copy-of>
</xsl:if>
</xsl:for-each>
</AsNumber>

<AsString>
<xsl:for-each select="./x">
<xsl:if test="string(./text()) &lt; '7'">
<xsl:copy-of select="."></xsl:copy-of>
</xsl:if>
</xsl:for-each>
</AsString>

</element>
</xsl:template>
</xsl:stylesheet>

预期输出:
<?xml version="1.0" encoding="utf-8"?>
<element>
<AsItComes>
<x>1</x>
<x>2</x>
<x>3</x>
<x>4</x>
<x>5</x>
<x>6</x>
<x>10</x>
</AsItComes>
<AsNumber>
<x>1</x>
<x>2</x>
<x>3</x>
<x>4</x>
<x>5</x>
<x>6</x>
</AsNumber>
<AsString>
<x>1</x>
<x>2</x>
<x>3</x>
<x>4</x>
<x>5</x>
<x>6</x>
<x>10</x>
</AsString>
</element>

实际输出:
<?xml version="1.0" encoding="utf-8"?>
<element>
<AsItComes>
<x>1</x>
<x>2</x>
<x>3</x>
<x>4</x>
<x>5</x>
<x>6</x>
</AsItComes>
<AsNumber>
<x>1</x>
<x>2</x>
<x>3</x>
<x>4</x>
<x>5</x>
<x>6</x>
</AsNumber>
<AsString>
<x>1</x>
<x>2</x>
<x>3</x>
<x>4</x>
<x>5</x>
<x>6</x>
</AsString>
</element>

最佳答案

看来,在 XSLT/XPATH 1.0 , string()执行比较时, value 仍然被评估为一个数字。

https://www.w3.org/TR/xpath/#booleans

When neither object to be compared is a node-set and the operator is <=, <, >= or >, then the objects are compared by converting both objects to numbers and comparing the numbers according to IEEE 754. The < comparison will be true if and only if the first number is less than the second number.



XSLT/XPATH 2.0 (以及 3.0 和 3.1),您可以将数据类型显式设置为 xs:string以确保比较是针对字符串执行的,而不是强制转换为数字值。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="2.0">
<xsl:template match="element">
<element>
<AsString>
<xsl:for-each select="./x">
<xsl:if test="xs:string(.) &lt; xs:string('7')">
<xsl:copy-of select="."></xsl:copy-of>
</xsl:if>
</xsl:for-each>
</AsString>
</element>
</xsl:template>
</xsl:stylesheet>

但是将值与字符串 '7' 进行比较就足够了(此外,您可以消除 <xsl:if> 并将过滤器放在谓词中):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="2.0">
<xsl:template match="element">
<element>
<AsString>
<xsl:for-each select="./x[. &lt; '7']">
<xsl:copy-of select="."></xsl:copy-of>
</xsl:for-each>
</AsString>
</element>
</xsl:template>
</xsl:stylesheet>

关于XSLT 将数字作为字符串进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34746893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com