2014-09-04 22 views
0

問題: 有什麼辦法,如何把XSL-T 2.0轉換成XML非法字符如1E「記錄分隔符」和1F「單位分隔符」放入CSV(文本)輸出?像如何將XSL-T 2.0轉換的XML(非法字符)輸入到CSV(文本)輸出中,如1E「記錄分隔符」和1F「單位分隔符」?

<xsl:text>&#x1F;</xsl:text> 

目標: 我想將XML轉換爲CSV使用XSL-T 2.0中使用最新的Java撒克遜HE(導入到SQL關係數據庫)。 CSV結果將包含多個元素作爲單獨的列,最新的列將包含部分XML(〜DocumentFragment)作爲CLOB或varchar。數據的負載將是巨大且永久的(至少在每12分鐘內將50萬個XML分成大約2分鐘的文件)。 XML可能大約有幾百種不同的類型〜XSD。

問題: 由於源XML可以包含Unicode字符集內的任何有效的XML字符,我面臨的問題,如何選擇字段(列)和記錄的分隔符(行)和字符串分隔符(」串」)。若要繞過使用(慢?)XSL-T字符串函數的文本替換和加倍分隔符和分隔符,我想使用這些字符,這些字符永遠不會出現在源XML中。所以我可以依靠一些多字符分隔符和delinmiters(不僅僅是一個字符),或者我將輸入中的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> 

非常感謝您的提示秒。 Stepan

回答

0

C1控制字符(如x1E和x1F)在XML 1.1中允許,但在XML 1.0中不允許。首先,在命令行中使用-xmlversion:1.1(或配置API中的等效選項),在Saxon中啓用XML 1.1支持。然後你有一個選擇。如果樣式表由XML 1.1解析器解析,則可以使用<xsl:text>&#x1f;</xsl:text>。如果沒有,你可以做<xsl:value-of select="codepoints-to-string(31)"/>

+0

是的,它的工作原理。謝謝! 此外,我必須在上面提到的解決方案中添加'disable-output-escaping =「yes」'來獲得真正的單個字符而不是XML字符引用。 – 2014-09-08 07:31:32

0

好,功能齊全的解決我的問題很簡單的例子是:

的test.xml

<?xml version="1.0" encoding="UTF-8"?> 
<root>a</root> 

測試。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">&#x1f;</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.1 

的test.txt

!hereIs001F!a 
相關問題