You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用XSLT实现XML标签的一对多关联组合?

解决XML中与同级配对生成独立的XSLT方案

嘿,这个需求其实很好实现,核心思路就是遍历每个原始<row>里的所有<pkz>标签,为每个<pkz>单独生成一个新的<row>节点,并把当前<row>对应的<number>标签一起放进去。我给你写了一段可用的XSLT脚本,直接就能用:

原始输入XML

<root>
  <row>
    <number>1</number>
    <pkz>aaa</pkz>
    <pkz>bbb</pkz>
  </row>
  <row>
    <number>2</number>
    <pkz>ccc</pkz>
    <pkz>aaa</pkz>
    <pkz>ddd</pkz>
  </row>
  <row>
    <number>3</number>
    <pkz>aaa</pkz>
    <pkz>yyy</pkz>
  </row>
</root>

期望输出XML

<row>
  <number>1</number>
  <pkz>aaa</pkz>
</row>
<row>
  <number>1</number>
  <pkz>bbb</pkz>
</row>
<row>
  <number>2</number>
  <pkz>ccc</pkz>
</row>
<row>
  <number>2</number>
  <pkz>aaa</pkz>
</row>
<row>
  <number>2</number>
  <pkz>ddd</pkz>
</row>
<row>
  <number>3</number>
  <pkz>aaa</pkz>
</row>
<row>
  <number>3</number>
  <pkz>yyy</pkz>
</row>

实现的XSLT脚本

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 匹配根节点,启动处理流程 -->
  <xsl:template match="/root">
    <!-- 遍历所有原始的<row>节点 -->
    <xsl:for-each select="row">
      <!-- 保存当前<row>下的<number>节点,后续复用 -->
      <xsl:variable name="currentNumber" select="number"/>
      <!-- 遍历当前<row>里的每一个<pkz> -->
      <xsl:for-each select="pkz">
        <!-- 生成新的<row>节点 -->
        <row>
          <!-- 复制对应的<number>节点 -->
          <xsl:copy-of select="$currentNumber"/>
          <!-- 复制当前遍历到的<pkz>节点 -->
          <xsl:copy-of select="."/>
        </row>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

脚本逻辑说明

  • 先匹配根节点<root>,进入处理流程;
  • 外层for-each遍历所有原始<row>,每个原始<row>对应一组<number>和多个<pkz>;
  • 用变量currentNumber保存当前<row>的<number>,避免重复查询;
  • 内层for-each遍历当前<row>下的每个<pkz>,为每个<pkz>生成独立的新<row>;
  • 最后用<xsl:copy-of>分别复制<number>和当前<pkz>到新<row>中,完成配对。

这个脚本兼容XSLT 1.0,几乎所有XML处理器都能运行,直接拿去用就好~

内容的提问来源于stack exchange,提问作者WAM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:29:04