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
相关产品推荐
相关产品推荐

