首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在XSL-T2.0转换XML的CSV (text)输出中加入1E“记录分隔符”和1F“单位分隔符”等非法字符?

如何在XSL-T2.0转换XML的CSV (text)输出中加入1E“记录分隔符”和1F“单位分隔符”等非法字符?
EN

Stack Overflow用户
提问于 2014-09-04 15:31:04
回答 2查看 530关注 0票数 0

的问题:有没有办法,如何将XSL-T2.0转换为的非法字符如1E“记录分隔符”和1F“单元分隔符”放入输出中?喜欢

代码语言:javascript
复制
 <xsl:text>&#x1F;</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非法字符输入到输出中,这是单字符解决方案。而且我想用

代码语言:javascript
复制
<xsl:output method="xml" omit-xml-declaration="yes" byte-order-mark="no" indent="no" encoding="UTF-8" />

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

代码语言:javascript
复制
<xsl:copy-of select="."/>

将CSV创建为XML输出听起来是无稽之谈,但根据我以前的发现,它处理起来非常快,编码也很短。

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

test.xml

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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> 

提前谢谢你的建议。斯蒂潘

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-04 20:57:04

C1控制字符(如x1E和x1F )在XML1.1中是允许的,但在XML1.0中不允许。因此,首先,使用命令行上的-xmlversion:1.1 (或配置API中的等效选项)在Saxon中启用XML1.1支持。那你就有选择了。如果XML1.1解析器解析了样式表,则可以使用<xsl:text>&#x1f;</xsl:text>。如果没有,你可以做<xsl:value-of select="codepoints-to-string(31)"/>

票数 0
EN

Stack Overflow用户

发布于 2014-09-08 07:39:58

很容易解决我的问题的例子是:

test.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<root>a</root>

test.xsl

代码语言:javascript
复制
<?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.bat

代码语言:javascript
复制
java -jar .\bin\saxon9he.jar -t -s:.\test.xml -xsl:.\test.xsl -o:.\test.txt -xmlversion:1.1

test.txt

代码语言:javascript
复制
!hereIs001F!a
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25669441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档