我正在尝试使用XSLT将CSV(逗号分隔的文件)转换为XML。
CSV示例:
weights_initializer = tf.random_normal()
所需的XML输出:
AcctEntryId,ValueDate,Entity,Folder,DenomCcy,FunctCcy
321,2017-08-29,ABC NY,My Portfolio/PAC,BR,US
322,2017-08-30,ABC NY,My Portfolio/PBC,BR,US
323,2017-08-31,ABC NY,My Portfolio/PCC,BR,US
我想从树液中的AL11文件夹中选择CSV文件。 xslt映射后的最终输出,希望它是上面指定的所需格式的XML文件。
请,您能指导我如何编码XSLT以便基于示例CSV数据生成上述XML。
答案 0 :(得分:1)
这是XSLT-2.0或更高版本的解决方案。我不知道SAP是否支持这一点。如果不是这样,请参阅下面的XSLT-1.0 hack。
您可以将XSLT-2.0功能unparsed-text()
与xsl:analyze-string
的RegEx功能结合使用:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:variable name="csv" select="replace(unparsed-text('file:///home/kubuntu/Downloads/a.csv'),'utf-8','')"/>
<xsl:template match="/">
<xsl:element name="ProcessResponse" namespace="http://com.test.ws/">
<xsl:element name="ProcessResult" namespace="http://com.test.ws/">
<xsl:value-of select="'<Data DataNodeName="CData" DataType="TEXT"><CData><![CDATA['" />
<xsl:analyze-string select="$csv" regex='(.+)\n'>
<xsl:matching-substring>
<xsl:value-of select="concat(regex-group(1),'
')" />
</xsl:matching-substring>
<xsl:non-matching-substring><xsl:sequence select="."/></xsl:non-matching-substring>
</xsl:analyze-string>
<xsl:value-of select="']]></CData></Data>
'" />
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
输出是所需的,尽管它的要求对我来说有点奇怪...
<?xml version="1.0" encoding="UTF-8"?>
<ProcessResponse xmlns="http://com.test.ws/">
<ProcessResult><Data DataNodeName="CData" DataType="TEXT"><CData><![CDATA[AcctEntryId,ValueDate,Entity,Folder,DenomCcy,FunctCcy
321,2017-08-29,ABC NY,My Portfolio/PAC,BR,US
322,2017-08-30,ABC NY,My Portfolio/PBC,BR,US
323,2017-08-31,ABC NY,My Portfolio/PCC,BR,US
]]></CData></Data>
</ProcessResult>
</ProcessResponse>
如果您仅限使用XSLT-1.0,则可以使用实体引用作为黑客,例如描述为in this SO answer。
答案 1 :(得分:0)
这是将您的CSV转换为XML的方法,没有 XSLT。所需的XML相当原始,因为它只有一个子节点,所以我相信XSLT在这里是多余的。
DATA: lv_data TYPE string,
lv_filename TYPE string VALUE 'C:\usr\sap\erp\sys\src\sample.csv',
lv_csv TYPE string.
OPEN DATASET lv_filename FOR INPUT IN TEXT MODE ENCODING DEFAULT.
WHILE sy-subrc = 0.
READ DATASET lv_filename INTO lv_data.
CHECK strlen( lv_data ) > 0.
lv_csv = lv_csv && lv_data && cl_abap_char_utilities=>cr_lf.
NDWHILE.
CLOSE DATASET lv_filename.
DATA(lo_ixml) = cl_ixml=>create( ).
DATA(lo_response) = lo_ixml->create_document( ).
DATA(lo_result) = lo_response->create_simple_element( name = 'ProcessResponse' parent = lo_response ).
CONCATENATE `<Data DataNodeName="CData" DataType="TEXT"><CData><![CDATA[`
v_csv `]]></CData></Data>` INTO lv_csv.
o_response->create_simple_element( name = 'ProcessResult' parent = lo_result value = lv_csv ).
DATA(lo_streamfactory) = lo_ixml->create_stream_factory( ).
DATA(lo_ostream) = lo_streamfactory->create_ostream_uri( system_id = 'C:\usr\sap\erp\sys\src\sample.xml' ).
DATA(lo_renderer) = lo_ixml->create_renderer( ostream = lo_ostream document = lo_response ).
DATA(ref_ixml_encoding) = lo_ixml->create_encoding( byte_order = 0 character_set = 'UTF-8' ).
o_ostream->set_encoding( encoding = ref_ixml_encoding ).
o_ostream->set_pretty_print( 'X' ).
o_renderer->render( ).
只要您将CSV放在C:\usr\sap\erp\sys\src\
目录中,然后将产生的XML放在相同的目录中,就可以运行此代码段。