的问题:有没有办法,如何将XSL-T2.0转换为的非法字符如1E“记录分隔符”和1F“单元分隔符”放入输出中?喜欢
<xsl:text></xsl:text>的目标:I希望使用最新的Java使用XSL-T2.0将转换为CSV (将导入关系sql数据库)。CSV结果将包含多个元素作为单独的列,而最新的列将包含部分XML (~ DocumentFragment)作为CLOB或varchar。数据的负载将是巨大的和永久的(在12小时内至少有50.000.000个XML被划分为大约2分钟的文件)。XML可能有几百种不同的类型~XSD。
问题:,因为源XML可以在Unicode字符集中包含任何有效的XML字符,我面临的问题是如何选择字段(列)和记录(行)和字符串分隔符(" string ")的分隔符。使用(slow?)绕过文本替换和加倍分隔符和分隔符。XSL-T字符串函数,我想使用的字符,不能出现在源XML。因此,我可以依赖一些多字符分隔符和删除器(不仅仅是一个字符),也可以依赖于将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输出听起来是无稽之谈,但根据我以前的发现,它处理起来非常快,编码也很短。
带有常规分隔符(分号和新行)和分隔符(双引号)的示例代码:
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<root>
<record>
<elementMetaA>name</elementMetaA>
<elementMetaB>datetime</elementMetaB>
<elementBody>
<anyXml01>
<anyXml02>myData02</anyXml02>
<anyXml03>myData03</anyXml03>
</anyXml01>
</elementBody>
</record>
</root>test.xsl
<?xml version="1.0" 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" />
<!-- simple example with
newline and semicolon as separators
and double quote as string delimiter -->
<xsl:template match="/root">
<xsl:apply-templates/>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="record">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="elementMetaA">
<xsl:text>"</xsl:text>
<xsl:value-of select="."/>
<xsl:text>", </xsl:text>
</xsl:template>
<xsl:template match="elementMetaB">
<xsl:text>"</xsl:text>
<xsl:value-of select="."/>
<xsl:text>", </xsl:text>
</xsl:template>
<xsl:template match="elementBody">
<xsl:text>"</xsl:text>
<xsl:copy-of select="."/>
<xsl:text>" </xsl:text>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet> 提前谢谢你的建议。斯蒂潘
发布于 2014-09-04 20:57:04
C1控制字符(如x1E和x1F )在XML1.1中是允许的,但在XML1.0中不允许。因此,首先,使用命令行上的-xmlversion:1.1 (或配置API中的等效选项)在Saxon中启用XML1.1支持。那你就有选择了。如果XML1.1解析器解析了样式表,则可以使用<xsl:text></xsl:text>。如果没有,你可以做<xsl:value-of select="codepoints-to-string(31)"/>。
发布于 2014-09-08 07:39:58
很容易解决我的问题的例子是:
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>a</root>test.xsl
<?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"></xsl:text>
<xsl:value-of select="./text()"/>
</xsl:template>
</xsl:stylesheet>test.bat
java -jar .\bin\saxon9he.jar -t -s:.\test.xml -xsl:.\test.xsl -o:.\test.txt -xmlversion:1.1test.txt
!hereIs001F!ahttps://stackoverflow.com/questions/25669441
复制相似问题