Xml XSLT转换的CSV文本输出在第三方应用程序中打开时会出现混乱
遇到了一点问题 我正在使用VS2015构建将在第三方程序中使用的XSLT。我已经将来自第三方程序(Epicor Service Connect)的示例数据生成为XML,并在此基础上构建了XSLT。现在,当我在VS中调试样式表时,我得到了预期的结果——列在顶部,用分号分隔,然后每个数据块都在下面,正如预期的那样 然而,当我通过Service Connect程序运行它时,我得到了一个完全的谜团: 我需要能够在CSV中使用分号作为分隔符返回数据。我在VS中获得的一小段数据表明这是可行的: 当然,当放入CSV时,它会显示正确的信息 任何好奇的人都可以使用XSLT(请注意,这是我使用XSLT的第二天,在此之前,我只知道它是什么的缩写-所以这并不奇怪-但是如果您有改进建议,我很乐意接受建设性的批评):Xml XSLT转换的CSV文本输出在第三方应用程序中打开时会出现混乱,xml,xslt,xslt-1.0,visual-studio-2015,epicorerp,Xml,Xslt,Xslt 1.0,Visual Studio 2015,Epicorerp,遇到了一点问题 我正在使用VS2015构建将在第三方程序中使用的XSLT。我已经将来自第三方程序(Epicor Service Connect)的示例数据生成为XML,并在此基础上构建了XSLT。现在,当我在VS中调试样式表时,我得到了预期的结果——列在顶部,用分号分隔,然后每个数据块都在下面,正如预期的那样 然而,当我通过Service Connect程序运行它时,我得到了一个完全的谜团: 我需要能够在CSV中使用分号作为分隔符返回数据。我在VS中获得的一小段数据表明这是可行的: 当然,当
;
;
;
;
一些样本数据:
服务连接之前(后期格式化):
<QueryResultDataSet>
<Results>
<Source_-_System>SOURCE SYSTEM 1</Source_-_System>
<Customer>96247</Customer>
<Description_-_Short>COMPANY DESCRIPTION SHORT</Description_-_Short>
<Description_-_Medium>COMPANY DESCRIPTION MEDIUM</Description_-_Medium>
<Description_-_Long>COMPANY DESCRIPTION LONG</Description_-_Long>
</Results>
<?xml version="1.0" encoding="utf-16"?>
<msg:Msg xsi:schemaLocation="http://Epicor.com/Message/2.0 http://scshost/schemas/epicor/ScalaMessage.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:msg="http://Epicor.com/Message/2.0">
<msg:Hdr>
<msg:Ctrl>
<msg:MsgID></msg:MsgID>
</msg:Ctrl>
<msg:Sender>
<msg:Name></msg:Name>
<msg:Subname></msg:Subname>
</msg:Sender>
<msg:Logon></msg:Logon>
</msg:Hdr>
<msg:Body>
<msg:Req msg-type="DocumentToProcess" action="MapAndProcess">
<msg:Dta>
<ext_UserSchema:QueryResultDataSet xmlns:msg="http://Epicor.com/InternalMessage/1.1" xmlns:ext_UserSchema="http://Epicor.com/SC/UserSchema">
<ext_UserSchema:Results>
<ext_UserSchema:Source_System>SOURCE_SYS1</ext_UserSchema:Source_System>
<ext_UserSchema:Vendor>96247</ext_UserSchema:Vendor>
<ext_UserSchema:Description_-_Short>COMPANY DESCRIPTION SHORT</ext_UserSchema:Description_-_Short>
<ext_UserSchema:Description_-_Medium>COMPANY DESCRIPTION MEDIUM</ext_UserSchema:Description_-_Medium>
<ext_UserSchema:Description_-_Long>COMPANY DESCRIPTION LONG</ext_UserSchema:Description_-_Long>
</ext_UserSchema:Results>
</ext_UserSchema:QueryResultDataSet>
</msg:Dta>
</msg:Req>
</msg:Body>
</msg:Msg>
源系统1
96247
公司简介
公司描述媒体
公司简介长
售后服务连接:
<QueryResultDataSet>
<Results>
<Source_-_System>SOURCE SYSTEM 1</Source_-_System>
<Customer>96247</Customer>
<Description_-_Short>COMPANY DESCRIPTION SHORT</Description_-_Short>
<Description_-_Medium>COMPANY DESCRIPTION MEDIUM</Description_-_Medium>
<Description_-_Long>COMPANY DESCRIPTION LONG</Description_-_Long>
</Results>
<?xml version="1.0" encoding="utf-16"?>
<msg:Msg xsi:schemaLocation="http://Epicor.com/Message/2.0 http://scshost/schemas/epicor/ScalaMessage.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:msg="http://Epicor.com/Message/2.0">
<msg:Hdr>
<msg:Ctrl>
<msg:MsgID></msg:MsgID>
</msg:Ctrl>
<msg:Sender>
<msg:Name></msg:Name>
<msg:Subname></msg:Subname>
</msg:Sender>
<msg:Logon></msg:Logon>
</msg:Hdr>
<msg:Body>
<msg:Req msg-type="DocumentToProcess" action="MapAndProcess">
<msg:Dta>
<ext_UserSchema:QueryResultDataSet xmlns:msg="http://Epicor.com/InternalMessage/1.1" xmlns:ext_UserSchema="http://Epicor.com/SC/UserSchema">
<ext_UserSchema:Results>
<ext_UserSchema:Source_System>SOURCE_SYS1</ext_UserSchema:Source_System>
<ext_UserSchema:Vendor>96247</ext_UserSchema:Vendor>
<ext_UserSchema:Description_-_Short>COMPANY DESCRIPTION SHORT</ext_UserSchema:Description_-_Short>
<ext_UserSchema:Description_-_Medium>COMPANY DESCRIPTION MEDIUM</ext_UserSchema:Description_-_Medium>
<ext_UserSchema:Description_-_Long>COMPANY DESCRIPTION LONG</ext_UserSchema:Description_-_Long>
</ext_UserSchema:Results>
</ext_UserSchema:QueryResultDataSet>
</msg:Dta>
</msg:Req>
</msg:Body>
</msg:Msg>
来源(系统1)
96247
公司简介
公司描述媒体
公司简介长
有人知道是什么导致了这个问题吗?我很惊讶我之前没有发现这个问题: 您的渲染出错,因为出现了错误!第一个字符是以Unicode或of表示的,第二个字符是使用UTF-16(顺序取决于endianness)或使用UTF-8并应用UTF-8解码(字节为0xEF、0xBB、0xBF)时字节顺序标记中的第一个和第二个字节 简而言之,要解决这个问题,请将
xsl:output
更改为包含:
<xsl:output byte-order-mark="no" />
但这只适用于XSLT2.0或更高版本。如果无法切换到XSLT2.0,则应检查处理器的文档,看它是否支持不带字节顺序标记的UTF-8编码
至少在某些情况下,当使用UTF-8的文本输出时。此外,在Windows上,记事本和许多其他编辑器在保存文件时会自动发出字节顺序标记(例如,如果您手动对CSV进行后期编辑,可能会发生这种情况)
要解决此问题,请执行以下操作之一:
- 使用任何处理器切换到XSLT 2.0
- 对输出进行后期处理以删除字节顺序标记
- 如果第三方软件有删除或忽略字节顺序标记的选项,请查看其文档
- 使用不输出字节顺序标记的其他编码
xsl:output
中设置)。您确定CSV必须用分隔吗代码>?典型的CSV带有,
(C代表逗号,而不是分号;)。嗨@Abel,谢谢你回复我。对于输出CSV列,我们要求标题中的下划线(u)被去除并替换为空格()。我将编辑这个问题,并提供我正在使用的两个样本数据集,以实现上述结果。我会给编码一个镜头-这是一个很好的点,很可能是真的。对于用分号分隔的CSV,我们已使默认语言格式以分号作为分隔符,因为值可能包含逗号,但不包含分号。提供了示例数据的一小部分。我现在将测试不同的编码类型。好的,我将等待您的更新(我很快就会离开,但明天会看到,或者其他人会看到)。关于您在两天后的XSLT技能,我印象深刻,您取得了非常好的进步,似乎理解了模板、模式、名称空间、焦点、上下文节点、位置和模式,因此您必须阅读了优秀的参考资料或是一位优秀的教师。竖起大拇指!很好的建议,还有一个。抱歉@Abel,我过去几天都没上班。我现在就试试这个,然后再回复你:)谢谢你的帮助!我做了一个梦。非常感谢你的帮助,亚伯!:)