如何将非法字符如1E“放入XSL-T2.0转换XML的CSV(文本)输出中;“记录分隔符”;和1F“;单元分隔符;?

如何将非法字符如1E“放入XSL-T2.0转换XML的CSV(文本)输出中;“记录分隔符”;和1F“;单元分隔符;?,xml,special-characters,xslt-2.0,export-to-csv,saxon,Xml,Special Characters,Xslt 2.0,Export To Csv,Saxon,问题: 有没有办法,如何将1E“记录分隔符”和1F“单位分隔符”等非法字符放入XSL-T2.0转换XML的CSV(文本)输出中?像 ; 目标: 我想使用XSL-T2.0和最新的JavaSaxonHE将XML转换为CSV(导入关系sql数据库)。CSV结果将包含多个元素作为单独的列,最新的列将包含部分XML(~DocumentFragment)作为CLOB或varchar。数据负载将是巨大且永久的(12小时内至少有50000.000 XMLs,每2分钟分为多个文件)。XMLs可以是数百

问题: 有没有办法,如何将1E“记录分隔符”和1F“单位分隔符”等非法字符放入XSL-T2.0转换XML的CSV(文本)输出中?像

;
目标: 我想使用XSL-T2.0和最新的JavaSaxonHE将XML转换为CSV(导入关系sql数据库)。CSV结果将包含多个元素作为单独的列,最新的列将包含部分XML(~DocumentFragment)作为CLOB或varchar。数据负载将是巨大且永久的(12小时内至少有50000.000 XMLs,每2分钟分为多个文件)。XMLs可以是数百种不同类型的xsd

问题: 因为源XML可以包含Unicode字符集中的任何有效XML字符,所以我面临的问题是,如何选择字段(列)和记录(行)的分隔符以及字符串分隔符(“字符串”)。为了避免使用(slow?)XSL-T字符串函数替换和加倍分隔符和分隔符,我希望使用源XML中永远不会出现的字符。因此,我可以依赖一些多字符分隔符和delinmiter(不仅仅是一个字符),或者我可以考虑将XML非法字符输入到输出中,这是单字符解决方案。此外,我想使用

<xsl:output method="xml" omit-xml-declaration="yes" byte-order-mark="no" indent="no" encoding="UTF-8" />

因为完整的XML输出到CSV的最后一列,我想创建为

<xsl:copy-of select="."/>

将CSV创建为XML输出听起来像是胡说八道,但根据我的previus发现,它的处理速度非常快,并且是编码的缩写

示例代码带有常规分隔符(分号和新行)和分隔符(双引号):

test.xml


名称
日期时间
myData02
myData03
test.xsl


" 
",  
" 
",  
" 
"  

提前感谢您的提示。XML 1.1中允许使用Stepan,但XML 1.0中不允许使用x1E和x1F等C1控制字符。因此,首先,在命令行上使用-xmlversion:1.1(或配置API中的等效选项),在Saxon中启用XML1.1支持。那你就有选择了。如果样式表由XML1.1解析器解析,则可以使用
。如果没有,您可以做

很好,解决我的问题的一个非常简单的例子是:

test.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>a</root>
<?xml version="1.1" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" omit-xml-declaration="yes" byte-order-mark="no" indent="no" encoding="UTF-8" />
  <xsl:template match="/root">
    <xsl:text disable-output-escaping="yes">&#x1f;</xsl:text>
    <xsl:value-of select="./text()"/>
  </xsl:template>
</xsl:stylesheet>
test.txt

java -jar .\bin\saxon9he.jar -t -s:.\test.xml -xsl:.\test.xsl -o:.\test.txt -xmlversion:1.1
!hereIs001F!a

是的,它起作用了。非常感谢。此外,我必须将
禁用输出转义=“yes”
添加到上述解决方案中,以获得真正的单字符引用,而不是XML字符引用。
<?xml version="1.1" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" omit-xml-declaration="yes" byte-order-mark="no" indent="no" encoding="UTF-8" />
  <xsl:template match="/root">
    <xsl:text disable-output-escaping="yes">&#x1f;</xsl:text>
    <xsl:value-of select="./text()"/>
  </xsl:template>
</xsl:stylesheet>
java -jar .\bin\saxon9he.jar -t -s:.\test.xml -xsl:.\test.xsl -o:.\test.txt -xmlversion:1.1
!hereIs001F!a