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

XSLT映射求助:多源重复元素映射至单目标元素

XSLT映射:将无界B元素下的C值映射到目标Y元素

没问题,这种处理无界重复元素的场景在XSLT里很常见,我给你拆解一下实现思路和代码:

首先先明确下典型的源/目标结构(如果你的实际结构有差异,只需要调整XPath路径就行):

示例源XML

<SourceRoot>
  <B>
    <C>First Item</C>
  </B>
  <B>
    <C>Second Item</C>
  </B>
  <B>
    <C>Third Item</C>
  </B>
</SourceRoot>

期望生成的目标XML

<TargetRoot>
  <Y>First Item</Y>
  <Y>Second Item</Y>
  <Y>Third Item</Y>
</TargetRoot>

实现方案(XSLT 1.0兼容)

这是最通用的写法,适配大部分XSLT处理器:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 匹配源文档的根节点,生成目标根节点容器 -->
  <xsl:template match="/SourceRoot">
    <TargetRoot>
      <!-- 遍历所有<B>下的<C>元素 -->
      <xsl:for-each select="B/C">
        <!-- 为每个<C>生成对应的<Y>元素,并赋值文本内容 -->
        <Y>
          <xsl:value-of select="."/>
        </Y>
      </xsl:for-each>
    </TargetRoot>
  </xsl:template>

  <!-- 空模板:阻止XSLT默认输出所有未匹配的节点,避免冗余内容 -->
  <xsl:template match="text()|@*"/>
</xsl:stylesheet>

关键要点:

  • XPath路径调整:如果你的<B>元素不是直接在根节点下(比如嵌套在<Parent>里),把select="B/C"改成select="Parent/B/C"即可,只要能准确定位到所有<C>元素就行。
  • <xsl:value-of select="."/>:这里的.代表当前选中的<C>节点的文本内容,直接把它输出到<Y>元素中。

更优雅的XSLT 2.0+写法

如果你的环境支持XSLT 2.0或更高版本,用模板匹配的方式会更符合XSLT的设计理念,扩展性也更好(比如后续要给<Y>加属性、处理特殊字符时更方便):

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 匹配源根节点,生成目标容器 -->
  <xsl:template match="/SourceRoot">
    <TargetRoot>
      <!-- 应用匹配<C>元素的模板 -->
      <xsl:apply-templates select="B/C"/>
    </TargetRoot>
  </xsl:template>

  <!-- 专门处理<C>元素,生成对应的<Y> -->
  <xsl:template match="B/C">
    <Y><xsl:value-of select="."/></Y>
  </xsl:template>

  <!-- 空模板:屏蔽默认输出 -->
  <xsl:template match="text()|@*"/>
</xsl:stylesheet>

这样不管有多少个<B>元素,只要里面有<C>,都会被自动转换成<Y>元素,完美适配无界的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:58:24