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

时间:2018-07-19 07:44:49

标签: xml csv xslt

我正在尝试从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是非常适合快速转换的一种。

注意:标签可能有所不同。给出一个例子

1 个答案:

答案 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>&#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>

检查。