如何从主XML的Trailer字段嵌套XML中提取指定字段并修正XSLT
解决方案
核心问题是
假设输入XML示例
<MainRequest> <Header> <Field1>Value1</Field1> <Field2>Value2</Field2> </Header> <Trailer><NestedXML><Field3>Val3</Field3><Field5>TargetValue</Field5></NestedXML></Trailer> </MainRequest>
XSLT 2.0+ 实现(推荐,兼容性更好)
大多数现代XML处理器(如Saxon、Altova)支持XSLT 2.0及以上版本,可直接使用parse-xml()函数解析转义文本:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/MainRequest"> <OutputXML> <!-- 原样保留原Header节点 --> <xsl:copy-of select="Header"/> <!-- 解析Trailer中的转义XML字符串为节点树 --> <xsl:variable name="nestedXmlTree" select="parse-xml(Trailer)"/> <!-- 提取嵌套XML中的Field5,并包装到指定结构 --> <ExtractedField> <xsl:copy-of select="$nestedXmlTree//Field5"/> </ExtractedField> </OutputXML> </xsl:template> </xsl:stylesheet>
XSLT 1.0 兼容方案(依赖处理器扩展)
如果只能使用XSLT 1.0,需要借助EXSLT或厂商扩展函数将转义文本转换为节点集:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/MainRequest"> <OutputXML> <xsl:copy-of select="Header"/> <!-- 先取消转义输出文本,再转换为节点集 --> <xsl:variable name="unescapedNestedXml"> <xsl:value-of select="Trailer" disable-output-escaping="yes"/> </xsl:variable> <xsl:variable name="nestedXmlTree" select="exsl:node-set($unescapedNestedXml)"/> <ExtractedField> <xsl:copy-of select="$nestedXmlTree//Field5"/> </ExtractedField> </OutputXML> </xsl:template> </xsl:stylesheet>
输出结果示例
<OutputXML> <Header> <Field1>Value1</Field1> <Field2>Value2</Field2> </Header> <ExtractedField> <Field5>TargetValue</Field5> </ExtractedField> </OutputXML>
注意事项
- XSLT 1.0方案依赖处理器支持
disable-output-escaping和EXSLT扩展,不同厂商实现可能有差异,稳定性不如2.0+版本。 - 确保
中的转义XML是格式正确的XML字符串,否则解析会失败。
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

