我正在尝试从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
address.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是非常适合快速转换的一种。
注意:标签可能有所不同。给出一个例子
答案 0 :(得分:0)
<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>
</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>
</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>
</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>
</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>
检查。