Workday集成:XML转CSV的XSLT转换&符号报错问题咨询
问题本质
报错The reference to entity "E" must end with the ';' delimiter是因为输入XML不合法:XML中出现了未正确转义的&符号(比如业务数据是M&E,但XML里直接写了M&E,没有转义为M&E)。XML解析器会把&E当作未完成的实体引用,因此抛出错误。
你尝试的<xsl:value-of select="replace(., '&', '&')"/>完全无效——它只是把&替换成&,没有解决任何问题,而且如果XML本身不合法,XSLT处理器根本无法启动转换。
解决方法
1. 修复输入XML的合法性(最优方案)
如果能控制Workday输出的XML格式,确保所有&符号都转义为&。比如原始业务数据中的M&E,在XML中必须写成:
<target-element>10337,ACMC,20240601,ACD,000M&E</target-element>
这样XML解析器能正常识别,XSLT处理时直接用<xsl:value-of select="."/>就能输出10337,ACMC,20240601,ACD,000M&E到CSV,实现原样输出&的需求。
2. 无法修改输入XML时的预处理方案
如果无法调整Workday的XML输出,需要先对不合法的XML进行预处理,把所有未转义的&替换为&。比如用Python脚本预处理:
with open('workday_input.xml', 'r') as f: xml_content = f.read() # 替换未转义的&,同时避免重复转义已有的& xml_content = xml_content.replace('&', '&').replace('&amp;', '&') with open('fixed_input.xml', 'w') as f: f.write(xml_content)
处理后的合法XML再交给XSLT转换,此时直接用<xsl:value-of select="."/>就能得到正确的&符号输出。
3. XSLT内部修正(仅适用于XML合法但内容有误的情况)
如果输入XML是合法的,但内容里错误地多转义了一次(比如实际需要M&E,但XML里写了M&amp;E),可以用XSLT的replace函数修正:
<xsl:value-of select="replace(., '&amp;', '&')"/>
这段代码会把重复转义的&amp;还原为&,最终输出时解析为&符号。
内容的提问来源于stack exchange,提问作者M.Ismail

