xml - XML to csv 做正确的 xslt
问题描述
我有一个大的 xml 文件,但我没有找到正确的 xslt 以根据需要输出 csv 文件的方法。
我试过一些 xslt 但没有找到正确的输出。
XML 输入格式为:
<?xml version="1.0" encoding="UTF-8"?>
<CONSOLIDATED_LIST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://test/test.xsd" dateGenerated="2015-08-03T19:03:43.593-04:00">
<INDIVIDUALS>
<INDIVIDUAL><DATAID>13</DATAID><VERSIONNUM>4</VERSIONNUM><FIRST_NAME> TEST </FIRST_NAME><SECOND_NAME> TEST</SECOND_NAME><THIRD_NAME/><UN_LIST_TYPE></UN_LIST_TYPE><REFERENCE_NUMBER></REFERENCE_NUMBER><LISTED_ON>10-12-1978</LISTED_ON><COMMENTS1>
</COMMENTS1><DESIGNATION><VALUE></VALUE></DESIGNATION><NATIONALITY><VALUE></VALUE></NATIONALITY><LIST_TYPE><VALUE></VALUE></LIST_TYPE><LAST_DAY_UPDATED><VALUE/></LAST_DAY_UPDATED><INDIVIDUAL_ALIAS><QUALITY/><ALIAS_NAME/></INDIVIDUAL_ALIAS><INDIVIDUAL_ADDRESS><COUNTRY/></INDIVIDUAL_ADDRESS><INDIVIDUAL_DATE_OF_BIRTH><TYPE_OF_DATE></TYPE_OF_DATE><DATE>1964-07-17</DATE></INDIVIDUAL_DATE_OF_BIRTH><INDIVIDUAL_PLACE_OF_BIRTH/><INDIVIDUAL_DOCUMENT><TYPE_OF_DOCUMENT></TYPE_OF_DOCUMENT><NUMBER></NUMBER></INDIVIDUAL_DOCUMENT><SORT_KEY/><SORT_KEY_LAST_MOD/></INDIVIDUAL>
</INDIVIDUALS>
<ENTITIES>
<ENTITY><DATAID></DATAID><VERSIONNUM>1</VERSIONNUM><FIRST_NAME></FIRST_NAME><UN_LIST_TYPE></UN_LIST_TYPE><REFERENCE_NUMBER></REFERENCE_NUMBER><LISTED_ON>1952-12-31</LISTED_ON><COMMENTS1></COMMENTS1><LIST_TYPE><VALUE></VALUE></LIST_TYPE><LAST_DAY_UPDATED><VALUE/></LAST_DAY_UPDATED><ENTITY_ALIAS><QUALITY/><ALIAS_NAME/></ENTITY_ALIAS><ENTITY_ADDRESS><CITY></CITY><COUNTRY></COUNTRY></ENTITY_ADDRESS><SORT_KEY/><SORT_KEY_LAST_MOD/>
</ENTITY>
</ENTITIES>
</CONSOLIDATED_LIST>
预期结果是一个用标题分隔的 csv 分号:示例:个人
Dataid;Versionnum;First_Name;Second_Name;Third_Name;Un_List_Type;Reference_Number;Listed_On;Comments1;Designation;Nationality;List_Type;Last_Day_Updated;Individual_Alias;Quality;Alias_Name;Individual_Address;Country;Individual_Date_Of_Bird;Individal_Place_Of_Birth;Type_Of_Date;Date;Individual_Place_Of_Birth;Individual_Document;Type_Of_Document;Number;Sort_Key;Sort_Key_Last_Mod
13;4; TEST ; TEST ;;;10-12-1978;;;;;;;;;;;;;;;;;1964-07-17;;;;;;;;;
在此标题下,标签、底部或其他文件中的数据
实体
Dataid;VersionNum;First_Name;Un_List_Type;Reference_Number;Listed_On;Comments1;List_Type;Last_Day_Updated;Entity_Alias;Quality;Alias_Name;Entity_Address;City;Country;Sort_Key;Sort_Key_Last_Mod;
;;1;;;;;;1952-12-31;;;;;;;;;;;;
原始 xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<CONSOLIDATED_LIST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://test/test.xsd" dateGenerated="2018-08-08T19:03:43.593-04:00">
<INDIVIDUALS>
<INDIVIDUAL><DATAID>6</DATAID><VERSIONNUM>1</VERSIONNUM><FIRST_NAME> TEST </FIRST_NAME><SECOND_NAME> TEST </SECOND_NAME><THIRD_NAME> TEST <THIRD_NAME/><UN_LIST_TYPE></UN_LIST_TYPE><REFERENCE_NUMBER></REFERENCE_NUMBER><LISTED_ON>1936-11-30</LISTED_ON><COMMENTS1></COMMENTS1><DESIGNATION><VALUE></VALUE></DESIGNATION><NATIONALITY><VALUE></VALUE></NATIONALITY><LIST_TYPE><VALUE></VALUE></LIST_TYPE><LAST_DAY_UPDATED><VALUE/></LAST_DAY_UPDATED><INDIVIDUAL_ALIAS><QUALITY/><ALIAS_NAME/></INDIVIDUAL_ALIAS><INDIVIDUAL_ADDRESS><COUNTRY/></INDIVIDUAL_ADDRESS><INDIVIDUAL_DATE_OF_BIRTH><TYPE_OF_DATE></TYPE_OF_DATE><DATE>1964-07-17</DATE></INDIVIDUAL_DATE_OF_BIRTH><INDIVIDUAL_PLACE_OF_BIRTH/><INDIVIDUAL_DOCUMENT><TYPE_OF_DOCUMENT>Passport</TYPE_OF_DOCUMENT><NUMBER></NUMBER></INDIVIDUAL_DOCUMENT><SORT_KEY/><SORT_KEY_LAST_MOD/></INDIVIDUAL>
<INDIVIDUAL><DATAID>6</DATAID><VERSIONNUM>1</VERSIONNUM><FIRST_NAME> TEST1</FIRST_NAME><SECOND_NAME> TEST1 </SECOND_NAME><THIRD_NAME/> TEST1 <THIRD_NAME/><UN_LIST_TYPE></UN_LIST_TYPE><REFERENCE_NUMBER></REFERENCE_NUMBER><LISTED_ON>1921-11-30</LISTED_ON><COMMENTS1/><DESIGNATION><VALUE></VALUE></DESIGNATION><NATIONALITY><VALUE></VALUE></NATIONALITY><LIST_TYPE><VALUE></VALUE></LIST_TYPE><LAST_DAY_UPDATED><VALUE/></LAST_DAY_UPDATED><INDIVIDUAL_ALIAS><QUALITY></QUALITY><ALIAS_NAME></ALIAS_NAME></INDIVIDUAL_ALIAS><INDIVIDUAL_ADDRESS><COUNTRY/></INDIVIDUAL_ADDRESS><INDIVIDUAL_DATE_OF_BIRTH><TYPE_OF_DATE>EXACT</TYPE_OF_DATE><DATE>1964-01-10</DATE></INDIVIDUAL_DATE_OF_BIRTH><INDIVIDUAL_PLACE_OF_BIRTH/><INDIVIDUAL_DOCUMENT/><SORT_KEY/><SORT_KEY_LAST_MOD/></INDIVIDUAL>
</INDIVIDUALS>
<ENTITIES>
<ENTITY><DATAID>6</DATAID><VERSIONNUM>1</VERSIONNUM><FIRST_NAME> TEST ENTITY </FIRST_NAME> <SECOND_NAME> ENTITY TEST </SECOND_NAME><UN_LIST_TYPE></UN_LIST_TYPE><REFERENCE_NUMBER></REFERENCE_NUMBER><LISTED_ON>1931-03-30</LISTED_ON><COMMENTS1></COMMENTS1><LIST_TYPE><VALUE></VALUE></LIST_TYPE><LAST_DAY_UPDATED><VALUE>2014-05-23</VALUE></LAST_DAY_UPDATED><ENTITY_ALIAS><QUALITY/><ALIAS_NAME/></ENTITY_ALIAS><ENTITY_ADDRESS><STREET></STREET><CITY></CITY><ZIP_CODE></ZIP_CODE><COUNTRY></COUNTRY></ENTITY_ADDRESS><SORT_KEY/><SORT_KEY_LAST_MOD/></ENTITY>
</ENTITIES>
</CONSOLIDATED_LIST>
已修改的 XSL 示例仅获得一项,而不是标签中的所有项。我想要声明了子数据的所有“个人”和所有“实体”。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:variable name="separator" select="';'" />
<xsl:variable name="newline" select="' '" />
<xsl:template match="/">
<xsl:text>Individuals:</xsl:text>
<xsl:text>DataID;First_Name;Second_Name;Third_Name</xsl:text>
<xsl:value-of select="$newline" />
<xsl:for-each select="//INDIVIDUALS">
<xsl:value-of select="INDIVIDUAL/DATAID" />
<xsl:value-of select="$separator" />
<xsl:value-of select="INDIVIDUAL/FIRST_NAME" />
<xsl:value-of select="$separator" />
<xsl:value-of select="INDIVIDUAL/SECOND_NAME" />
<xsl:value-of select="$separator" />
<xsl:value-of select="INDIVIDUAL/THIRD_NAME" />
<xsl:value-of select="$newline" />
<xsl:value-of select="INDIVIDUAL/DATAID" />
<xsl:value-of select="$separator" />
<xsl:value-of select="INDIVIDUAL/FIRST_NAME" />
<xsl:value-of select="$separator" />
<xsl:value-of select="INDIVIDUAL/SECOND_NAME" />
<xsl:value-of select="$separator" />
<xsl:value-of select="INDIVIDUAL/THIRD_NAME" />
<xsl:value-of select="$newline" />
</xsl:for-each>
</xsl:template>
<xsl:template1 match="/">
<xsl:text>Entities:</xsl:text>
<xsl:text>First_Name;Second_Name;Third_Name</xsl:text>
<xsl:value-of select="$newline" />
<xsl:for-each select="//ENTITIES">
<xsl:value-of select="ENTITY/FIRST_NAME" />
<xsl:value-of select="$separator" />
<xsl:value-of select="ENTITY/SECOND_NAME" />
<xsl:value-of select="$separator" />
<xsl:value-of select="ENTITY/THIRD_NAME" />
<xsl:value-of select="$newline" />
</xsl:for-each>
</xsl:template1>
</xsl:stylesheet>
正在做:xslproc origin.xml test.xsl 结果:
Individuals:
DataID;First_Name;Second_Name;Third_Name
6; TEST ; TEST ;; TEST
6; TEST ; TEST ;; TEST
预期的结果是:
Individuals:
DataID;First_Name;Second_Name;Third_Name
6; TEST ; TEST ; TEST
6; TEST1 ; TEST1 ; TEST1
Entities:
First_Name;Second_Name;Third_Name
TEST ENTITY ; ENTITY TEST ;;
更新:
在回答 xsl Input xml 的测试中:
<?xml version="1.0" encoding="UTF-8"?>
<CONSOLIDATED_LIST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://test/test.xsd" dateGenerated="2012-08-08T19:03:43.593-04:00">
<INDIVIDUALS>
<INDIVIDUAL><DATAID>5</DATAID><VERSIONNUM>1</VERSIONNUM><FIRST_NAME> TEST </FIRST_NAME><SECOND_NAME>TEST1</SECOND_NAME><THIRD_NAME/><UN_LIST_TYPE></UN_LIST_TYPE><REFERENCE_NUMBER></REFERENCE_NUMBER><LISTED_ON>2016-11-30</LISTED_ON><COMMENTS1></COMMENTS1><DESIGNATION><VALUE></VALUE></DESIGNATION><NATIONALITY><VALUE></VALUE></NATIONALITY><LIST_TYPE><VALUE></VALUE></LIST_TYPE><LAST_DAY_UPDATED><VALUE/></LAST_DAY_UPDATED><INDIVIDUAL_ALIAS><QUALITY/><ALIAS_NAME/></INDIVIDUAL_ALIAS><INDIVIDUAL_ADDRESS><COUNTRY/></INDIVIDUAL_ADDRESS><INDIVIDUAL_DATE_OF_BIRTH><TYPE_OF_DATE>EXACT</TYPE_OF_DATE><DATE>1964-07-17</DATE></INDIVIDUAL_DATE_OF_BIRTH><INDIVIDUAL_PLACE_OF_BIRTH/><INDIVIDUAL_DOCUMENT><TYPE_OF_DOCUMENT></TYPE_OF_DOCUMENT><NUMBER></NUMBER></INDIVIDUAL_DOCUMENT><SORT_KEY/><SORT_KEY_LAST_MOD/></INDIVIDUAL>
<INDIVIDUAL><DATAID></DATAID><VERSIONNUM></VERSIONNUM><FIRST_NAME>TEST</FIRST_NAME><SECOND_NAME>TEST2</SECOND_NAME><THIRD_NAME/><UN_LIST_TYPE></UN_LIST_TYPE><REFERENCE_NUMBER></REFERENCE_NUMBER><LISTED_ON>2016-11-30</LISTED_ON><COMMENTS1/><DESIGNATION><VALUE></VALUE></DESIGNATION><NATIONALITY><VALUE></VALUE></NATIONALITY><LIST_TYPE><VALUE></VALUE></LIST_TYPE><LAST_DAY_UPDATED><VALUE/></LAST_DAY_UPDATED><INDIVIDUAL_ALIAS><QUALITY></QUALITY><ALIAS_NAME></ALIAS_NAME></INDIVIDUAL_ALIAS><INDIVIDUAL_ADDRESS><COUNTRY/></INDIVIDUAL_ADDRESS><INDIVIDUAL_DATE_OF_BIRTH><TYPE_OF_DATE></TYPE_OF_DATE><DATE>1964-01-10</DATE></INDIVIDUAL_DATE_OF_BIRTH><INDIVIDUAL_PLACE_OF_BIRTH/><INDIVIDUAL_DOCUMENT/><SORT_KEY/><SORT_KEY_LAST_MOD/></INDIVIDUAL>
</INDIVIDUALS>
<ENTITIES>
<ENTITY><DATAID></DATAID><VERSIONNUM>1</VERSIONNUM><FIRST_NAME> TEST
</FIRST_NAME><UN_LIST_TYPE></UN_LIST_TYPE><REFERENCE_NUMBER></REFERENCE_NUMBER><LISTED_ON>2012-09-11</LISTED_ON><COMMENTS1></COMMENTS1><LIST_TYPE><VALUE></VALUE></LIST_TYPE><LAST_DAY_UPDATED><VALUE/></LAST_DAY_UPDATED><ENTITY_ALIAS><QUALITY/><ALIAS_NAME/></ENTITY_ALIAS><ENTITY_ADDRESS><CITY>Pyongyang</CITY><COUNTRY></COUNTRY></ENTITY_ADDRESS><SORT_KEY/><SORT_KEY_LAST_MOD/></ENTITY>
</ENTITIES>
</CONSOLIDATED_LIST>
输出:
First_Name;Second_Name;Third_Name
TEST ;TEST1;;
TEST;TEST2;;
Entities:
First_Name;Second_Name;Third_Name
TEST
;;
解决方案
这仍然非常令人困惑。试试这个作为你的起点:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/CONSOLIDATED_LIST">
<!-- INDIVIDUALS -->
<!-- header -->
<xsl:text>Individuals: DataID;First_Name;Second_Name;Third_Name </xsl:text>
<!-- data -->
<xsl:for-each select="INDIVIDUALS/INDIVIDUAL">
<xsl:value-of select="DATAID"/>
<xsl:text>;</xsl:text>
<xsl:value-of select="FIRST_NAME"/>
<xsl:text>;</xsl:text>
<xsl:value-of select="SECOND_NAME"/>
<xsl:text>;</xsl:text>
<xsl:value-of select="THIRD_NAME" />
<xsl:text> </xsl:text>
</xsl:for-each>
<!-- ENTITIES -->
<!-- header -->
<xsl:text>Entities: Dataid;VersionNum;First_Name </xsl:text>
<!-- data -->
<xsl:for-each select="ENTITIES/ENTITY">
<xsl:text>;</xsl:text>
<xsl:value-of select="DATAID"/>
<xsl:text>;</xsl:text>
<xsl:value-of select="VERSIONNUM"/>
<xsl:text>;</xsl:text>
<xsl:value-of select="FIRST_NAME" />
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- javascript - Xpath 返回下元素的空值
标签 - python - PermissionError 仅在第一次引发 - pd.ExcelWriter.save()
- c++ - 如何匹配环境不同的两组?C++
- java - 减少 Hibernate 存储库中的样板代码/在桌面客户端-服务器应用程序中使用 Spring 的 JpaRepository 接口
- ios - 在真实设备上获取位置不起作用
- twilio - 特维利奥
错误:DTMF 消息中没有 callid - node.js - TransferHttpCacheModule 不能防止 Angular 8 中的重复 HTTP 调用
- ruby - 为什么我的 attr_accessor 变量返回 nil?
- numpy - numpy.polynomial.chebyshev 中二维切比雪夫级数的系数
- android - Android:向 mipmap 图标启动器添加阴影