You need to enable JavaScript to run this app. XSLT输出不符合预期:移除XML父节点并拷贝内容结果与预期不符
优惠活动
大模型
产品
解决方案
定价
更多

XSLT输出不符合预期:移除XML父节点并拷贝内容结果与预期不符

代码问题根因

原实现存在两个核心问题,直接导致输出不符合预期:

  • XPath定位失效:输入XML的所有业务节点都绑定了命名空间(分别对应ns0、ns3前缀),但原XSLT未在样式表中声明这些命名空间,且XPath路径未使用对应前缀,导致路径根本匹配不到目标节点,xsl:copy-of操作无内容可拷贝。
  • 输出结构偏移:原代码手动创建了无命名空间前缀的<Response>节点,既没有保留要求的ns3:前缀,也没有还原原节点的完整结构。
可实现预期效果的修改方案

核心调整逻辑:在样式表中显式声明所有用到的命名空间,直接完整拷贝目标<ns3:Response>节点本身,无需手动重构节点结构。
修改后的完整XSLT代码:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge"
  xmlns:ns3="urn:enoc.com:HTRUAE:EmployeeLeavesData_Portal">

  <xsl:template match="/">
    <!-- 直接定位完整的ns3:Response节点做拷贝,跳过外层ns0父节点层级 -->
    <xsl:copy-of select="/ns0:Messages/ns0:Message1/ns3:Response" />
  </xsl:template>

</xsl:stylesheet>

运行效果说明

执行上述代码后,输出内容和预期完全一致:

<ns3:Response>节点自身的命名空间声明、下属所有<EmployeeLeave>子节点的结构与值都会完整保留,不会生成多余的空标签,也不会丢失命名空间前缀。

补充说明

如果不想在样式表中声明ns0对应的命名空间,也可以通过local-name()函数做匹配定位,但这种写法会降低XPath匹配效率,仅作为临时替代方案:

<xsl:copy-of select="*[local-name()='Messages']/*[local-name()='Message1']/*[local-name()='Response']" />

内容的提问来源于stack exchange,提问作者Akash ganga Shrivastava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 12:06:03