XSLT转换忽略命名空间后输出为HTML而非XML的问题求助
XSLT转换忽略命名空间后输出为HTML而非XML的问题求助
我来帮你梳理下问题根源,再给出针对性的解决方案!
你当前遇到的问题主要来自两个关键疏漏:
- 模板匹配的节点不存在:你的XSLT模板写的是匹配
*[local-name()='elementName'],但你的输入XML里根本没有这个元素,所以XSLT会触发默认模板规则——默认模板会遍历所有节点并输出文本内容,这就导致你看到的不是预期的结构化XML,反而像是杂乱的文本(你误以为是HTML)。 - 节点选择未处理命名空间:
xsl:for-each里直接写ServiceResponse/Parties/Party,但这些节点都带有out命名空间,直接这么写根本选不到任何节点,就算模板能触发,也生成不了预期内容。
针对你「必须忽略命名空间、不能反复写前缀」的需求,修改后的XSLT如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <!-- 匹配根节点,确保转换从这里启动,不走默认模板 --> <xsl:template match="/"> <Entities> <xResults> <!-- 用local-name()忽略命名空间,精准选择目标节点 --> <xsl:for-each select="//*[local-name()='ServiceResponse']/*[local-name()='Parties']/*[local-name()='Party']"> <aParty> <Field1Transformed> <xsl:value-of select="*[local-name()='Field1']"/> </Field1Transformed> <Field2Transformed> <xsl:value-of select="*[local-name()='Field2']"/> </Field2Transformed> </aParty> </xsl:for-each> </xResults> </Entities> </xsl:template> <!-- 覆盖默认文本模板,避免输出不必要的空白字符 --> <xsl:template match="text()"/> </xsl:stylesheet>
修改说明:
- 把模板改为匹配根节点
/,确保整个转换按你的逻辑执行,不会触发默认模板的混乱输出。 - 所有节点选择都用
*[local-name()='节点名']的方式,彻底绕开命名空间,不用写任何前缀。 - 添加空文本模板,过滤输入XML里的空白字符,让输出更整洁规范。
用这个XSLT处理你的输入XML,就能得到预期的结构化XML输出:
<?xml version="1.0" encoding="UTF-8"?> <Entities> <xResults> <aParty> <Field1Transformed>Value1</Field1Transformed> <Field2Transformed>Value2</Field2Transformed> </aParty> </xResults> </Entities>
备注:内容来源于stack exchange,提问作者Measel
相关产品推荐
相关产品推荐

