在 XSLT (Extensible Stylesheet Language Transformations) 中处理 XML 数据时,经常需要查找特定条件下的元素。查找子元素的最大值并获取其父元素是一个常见的需求,这涉及到 XPath 表达式和 XSLT 模板的使用。
xsl:for-each
和 max()
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<!-- 找到所有子元素中的最大值 -->
<xsl:variable name="maxValue">
<xsl:for-each select="//childElement">
<xsl:sort select="." data-type="number" order="descending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<!-- 获取包含最大值的父元素 -->
<xsl:for-each select="//parentElement[childElement = $maxValue]">
<!-- 处理父元素 -->
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
max()
函数(需要支持 XSLT 2.0 的处理器)<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<!-- 计算最大值 -->
<xsl:variable name="maxValue" select="max(//childElement/number(.))"/>
<!-- 获取包含最大值的父元素 -->
<xsl:for-each select="//parentElement[childElement = $maxValue]">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="childValues" match="childElement" use="."/>
<xsl:template match="/">
<!-- 找到最大值 -->
<xsl:variable name="maxValue">
<xsl:for-each select="//childElement">
<xsl:sort select="." data-type="number" order="descending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<!-- 使用键快速查找父元素 -->
<xsl:for-each select="key('childValues', $maxValue)/..">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
number()
函数<xsl:sort select="number(.)" order="descending"/>
[1]
限定符//parentElement/childElement
而不是 //childElement
这种技术在以下场景中非常有用:
通过以上方法,您可以有效地在 XSLT 中查找子元素的最大值并获取其父元素。
没有搜到相关的文章