XML以使用XSL展开CSV/JSON转换



我正试图从XML文件创建一个CSV文件。在这里,XML可以有多个子/父标记。这些标签不是固定的。它将是动态的。输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<employees>
<employee>
<emp_id>123</emp_id>
<emp_name>john</emp_name>
<emp_type>permanent</emp_type>
<addresses>
<address>
<flat_no>23</flat_no>
<street>Ville Street</street>
<state>California</state>
<country>USA</country>
</address>
<address>
<flat_no>24</flat_no>
<street>Parlour Street</street>
<state>New York</state>
<country>USA</country>
</address>
<address>
<flat_no>25</flat_no>
<street>Parle Street</street>
<state>Canada</state>
<country>USA</country>
</address>
<address>
<flat_no>26</flat_no>
<street>Ville Parle Street</street>
<state>New Jersey</state>
<country>USA</country>
</address>
<address>
<flat_no>27</flat_no>
<street>Parle Ville Street</street>
<state>San Jose</state>
<country>USA</country>
</address>
</addresses>
<salary>
<pay_scale>Manager</pay_scale>
<tax_id>12345</tax_id>
</salary>
</employee>
</employees>

输出示例如下:

employee.csv应具有以下列和数据:

emp_id,emp_name,emp_type
123,john,permanent

地址.csv应具有以下列和数据:

emp_id,emp_name,emp_type,flat_no,street,state,country,payscale,tax_id
123,john,permanent,23,Ville Street,California,USA,,
123,john,permanent,24,Parlour Street,New York,USA,,
123,john,permanent,25,Parle Street,Canada,USA,,
123,john,permanent,26,Ville Parle Street,New Jersey,USA,,
123,john,permanent,27,Parle Ville Street,San Jose,USA,,

salary.csv应具有以下列和数据:

emp_id,emp_name,emp_type,pay_scale,tax_id
123,john,permanent,Manager,12345

事情应该是这样的。所有子标签(即,不在父标签内(都应在一个CSV文件中,如果出现任何父标签,则应进入另一个CSV档案,如地址、工资。

由于我是XSLT的新手,我不知道该怎么做。我听说XML<-->XSLT<-->CSV更快,即XSLT是一种适合快速转换的格式。

注意:驾驶室的标签多种多样。举一个的例子

<xsl:output indent="yes" method="text"/>
<xsl:template match="employees">
<xsl:result-document href="emp.txt">
<xsl:value-of select="employee/emp_id/local-name(),employee/emp_name/local-name(),employee/emp_type/local-name()" separator=","/>
<xsl:text>&#x0A;</xsl:text>
<xsl:value-of select="employee/emp_id,employee/emp_name,employee/emp_type" separator=","/>
</xsl:result-document>
<xsl:for-each select="employee/addresses">
<xsl:result-document href="address.txt">
<xsl:value-of select="parent::employee/emp_id/local-name(),parent::employee/emp_name/local-name(),parent::employee/emp_type/local-name(),address[1]/flat_no/local-name(),address[1]/street/local-name(),address[1]/state/local-name(),address[1]/country/local-name()" separator=","/>
<xsl:text>&#x0A;</xsl:text>
<xsl:for-each select="address">
<xsl:value-of select="ancestor::employee/emp_id,ancestor::employee/emp_name,ancestor::employee/emp_type,flat_no,street,state,country" separator=", "/>
<xsl:text>&#x0A;</xsl:text>
</xsl:for-each>
</xsl:result-document>
</xsl:for-each>
<xsl:for-each select="employee">
<xsl:result-document href="salary.txt">
<xsl:value-of select="emp_id/local-name(),emp_name/local-name(),emp_type/local-name(),salary/pay_scale/local-name(),salary/tax_id/local-name()" separator=","/>
<xsl:text>&#x0A;</xsl:text>
<xsl:value-of select="emp_id,emp_name,emp_type,salary/pay_scale,salary/tax_id" separator=","/>
</xsl:result-document>
</xsl:for-each>
</xsl:template>

检查一下。

最新更新