如何使用XSLT按指定条件查找匹配元素,按长度和数值取最大值
问题原因
- 你现有代码中
$list变量的XPath表达式是布尔比较逻辑,所以运行后只会返回true/false,而非你需要的节点值 - 缺少第二步筛选逻辑:没有先过滤出所有长度等于最大长度的元素,再从中提取数值最大的目标元素
修复后的完整XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="#all" version="3.0"> <xsl:mode on-no-match="shallow-copy"/> <xsl:template match="root"> <!-- 计算最大字符串长度 --> <xsl:variable name="maxLength" select="max(data/label.designator/string-length(.))" as="xs:integer"/> Max string length is: <xsl:value-of select="$maxLength"/><br/> <!-- 筛选符合要求的目标值 --> <xsl:variable name="targetValue"> <xsl:for-each select="data/label.designator[string-length(.) = $maxLength]"> <!-- 去掉末尾的点转成数值后降序排序 --> <xsl:sort select="xs:decimal(replace(., '\.$', ''))" order="descending" data-type="number"/> <xsl:if test="position() = 1"> <xsl:value-of select="."/> </xsl:if> </xsl:for-each> </xsl:variable> and value is : <xsl:value-of select="$targetValue"/> </xsl:template> </xsl:stylesheet>
逻辑说明
- 直接用XPath 3.0的
max()函数计算所有label.designator的最大字符串长度,比循环写法更简洁 - 先过滤出所有字符串长度等于最大长度的节点,再将节点内容去掉末尾的
.转换为十进制数值,按降序排序后取第一个,就是同时满足长度最长、数值最大的目标元素 - 运行后输出完全匹配你给出的预期结果
内容的提问来源于stack exchange,提问作者Sai Prasad Mukthapuram
相关产品推荐
相关产品推荐

