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

使用XSLT复制XML节点并仅转换特定兄弟节点的xyz:ID

正确XSLT实现方案:保留属性,仅清理指定ID节点空格

一、XML示例

先看原始XML结构(包含命名空间及带属性的ID节点):

<root xmlns:xyz="http://example.com/xyz">
  <Item>
    <xyz:ID xyz:priorValue="123 456">123 456</xyz:ID>
    <xyz:IdType>A Type</xyz:IdType>
  </Item>
  <Item>
    <xyz:ID xyz:priorValue="789 012">789 012</xyz:ID>
    <xyz:IdType>B Type</xyz:IdType>
  </Item>
</root>

二、错误的XSLT及问题

之前尝试的XSLT因直接重写节点导致属性丢失:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xyz="http://example.com/xyz">
  <xsl:template match="xyz:ID[../xyz:IdType='A Type']">
    <xyz:ID>
      <xsl:value-of select="translate(., ' ', '')"/>
    </xyz:ID>
  </xsl:template>
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

问题:处理符合条件的xyz:ID时,直接创建新节点,未复制原节点的属性(如xyz:priorValue),导致属性丢失。

三、正确的XSLT实现

核心逻辑:用身份模板默认复制所有内容,仅对目标节点保留属性、修改文本:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xyz="http://example.com/xyz">
  <!-- 身份模板:默认复制所有节点、属性和文本 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- 匹配兄弟节点xyz:IdType为"A Type"的xyz:ID节点 -->
  <xsl:template match="xyz:ID[../xyz:IdType='A Type']">
    <!-- 复制原节点(自动保留节点结构) -->
    <xsl:copy>
      <!-- 先复制所有属性 -->
      <xsl:apply-templates select="@*"/>
      <!-- 输出去除空格后的文本 -->
      <xsl:value-of select="translate(., ' ', '')"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

关键改动:用<xsl:copy>保留原节点属性,先处理属性再输出清理后的文本,避免属性丢失。

四、效果验证

处理后的XML结果:

<root xmlns:xyz="http://example.com/xyz">
  <Item>
    <xyz:ID xyz:priorValue="123 456">123456</xyz:ID>
    <xyz:IdType>A Type</xyz:IdType>
  </Item>
  <Item>
    <xyz:ID xyz:priorValue="789 012">789 012</xyz:ID>
    <xyz:IdType>B Type</xyz:IdType>
  </Item>
</root>

可以看到:

  • 第一个xyz:ID文本空格被清除,同时保留了xyz:priorValue属性
  • 第二个xyz:ID完全保持原样,符合需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:53:14