問題: 有什麼辦法,如何把XSL-T 2.0轉換成XML非法字符如1E「記錄分隔符」和1F「單位分隔符」放入CSV(文本)輸出?像如何將XSL-T 2.0轉換的XML(非法字符)輸入到CSV(文本)輸出中,如1E「記錄分隔符」和1F「單位分隔符」?
<xsl:text></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
是的,它的工作原理。謝謝! 此外,我必須在上面提到的解決方案中添加'disable-output-escaping =「yes」'來獲得真正的單個字符而不是XML字符引用。 – 2014-09-08 07:31:32