XSLT拆分节点、跳过前两项并按key分组的实现咨询
实现方案(基于XSLT 2.0及以上版本)
完整代码示例
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" omit-xml-declaration="no"/> <!-- 此处根节点匹配规则可根据你的实际源XML根节点名称调整 --> <xsl:template match="/root"> <!-- 第一步:转换item结构、跳过前2个item --> <xsl:variable name="processedItems"> <xsl:for-each select="item[position() > 2]"> <xsl:variable name="nameParts" select="tokenize(name, '-')"/> <item> <key><xsl:value-of select="$nameParts[1]"/></key> <control><xsl:value-of select="$nameParts[2]"/></control> <!-- 两种取值方式二选一即可 --> <!-- 方式1:直接从当前源item读取value --> <value><xsl:value-of select="value"/></value> <!-- 方式2:使用你已定义的$data变量取值 --> <!-- <value><xsl:value-of select="$data/*[name() = current()/name]"/></value> --> </item> </xsl:for-each> </xsl:variable> <!-- 第二步:按key字段分组处理 --> <root> <xsl:for-each-group select="$processedItems/item" group-by="key"> <!-- 此处填写分组后的自定义处理逻辑,以下为示例代码:输出分组包裹结构 --> <group key="{current-grouping-key()}"> <xsl:copy-of select="current-group()"/> </group> </xsl:for-each-group> </root> </xsl:template> </xsl:stylesheet>
关键逻辑说明
- 跳过前两个item:通过
item[position() > 2]筛选,XPath的position()默认从1开始计数,完全匹配需求 - 拆分name字段:使用
tokenize(name, '-')函数按横杠拆分name值,返回的序列第一个元素为key,第二个为control - 取值兼容:你预先定义的
$data变量可以正常使用,替换value部分的取值逻辑即可,代码中已给出注释示例 - 分组逻辑:先将所有转换完成的item存入临时变量
$processedItems,再对该变量内的item执行group-by="key"分组,current-group()可获取当前分组下的所有item,current-grouping-key()可获取当前分组的key值
内容的提问来源于stack exchange,提问作者MatterOfFact
相关产品推荐
相关产品推荐

