使用 XSLT 从 XML 创建平面 CSV [英] Create flat CSV from XML with XSLT

查看:26
本文介绍了使用 XSLT 从 XML 创建平面 CSV的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用 XSLD 将数据从 XML 转换为平面 CSV.有谁知道我可以用什么函数使数据平坦?

I want to convert the data from an XML to a flat CSV using XSLD. Does anyone know a function with which I can get the data flat?

数据

<objects>
    <object>
        <name>A</name>
        <sku>SKU-A</sku>
        <variants>
            <variant>
                <sku>V-SKU-A1</sku>
            </variant>
            <variant>
                <sku>V-SKU-A2</sku>
            </variant>
        </variants>
    </object>
    <object>
        <name>B</name>
        <sku>SKU-B</sku>
        <variants>
            <variant>
                <sku>V-SKU-B1</sku>
            </variant>
            <variant>
                <sku>V-SKU-B2</sku>
            </variant>
        </variants>
    </object>
</objects>

想要的结果

Name;SKU;Variant-SKU
A;SKU-A;V-SKU-A1
A;SKU-A;V-SKU-A2
B;SKU-B;V-SKU-B1
B;SKU-B;V-SKU-B2

我目前的尝试

<?xml version="1.0" encoding="UTF-8"?>
<files>
    <file filename="example.csv" search="|" replace=" " quotes="double">
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
            <xsl:output method="text" />

            <xsl:variable name="qs" select="'&#34;'" />
            <xsl:variable name="qe" select="'&#34;;'" />
            <xsl:variable name="qeo" select="';'" />
            <xsl:variable name="qend" select="'&#34;&#xA;'" />

            <xsl:template match="object">

                <xsl:value-of select="$qs" /><xsl:value-of select="name" /><xsl:value-of select="$qe" />
                <xsl:value-of select="$qs" /><xsl:value-of select="sku" /><xsl:value-of select="$qe" />

                <xsl:apply-templates select="variants/variant" />

            </xsl:template>

            <xsl:template match="variant">
                <xsl:value-of select="$qs" /><xsl:value-of select="sku" /><xsl:value-of select="$qe" />
            </xsl:template>

            <xsl:template match="/">
                <xsl:text>Name;SKU;Variant-SKU</xsl:text> <xsl:text>&#xA;</xsl:text>
                <xsl:apply-templates select="objects/object" />
            </xsl:template>

        </xsl:stylesheet>
    </file>
</files>

我目前的成绩

Name;SKU;Variant-SKU
A;SKU-A;V-SKU-A1;V-SKU-A2
B;SKU-B;V-SKU-B1;V-SKU-B2

推荐答案

或者干脆:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />

<xsl:template match="/objects">
    <!-- header -->
    <xsl:text>Name;SKU;Variant-SKU&#10;</xsl:text>
    <!-- data -->
    <xsl:for-each select="object">
        <xsl:variable name="object-data">
            <xsl:value-of select="name"/>
            <xsl:text>;</xsl:text>
            <xsl:value-of select="sku"/>
            <xsl:text>;</xsl:text>
        </xsl:variable>
        <xsl:for-each select="variants/variant">
            <xsl:copy-of select="$object-data"/>
            <xsl:value-of select="sku"/>
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

这通过将父对象的数据存储在变量中来避免重复查找父对象的数据.

This avoids repeated lookup of parent object's data by storing it in a variable.

这篇关于使用 XSLT 从 XML 创建平面 CSV的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆