使用 XSLT 从 XML 创建平面 CSV [英] Create flat CSV from XML with XSLT
本文介绍了使用 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="'"'" />
<xsl:variable name="qe" select="'";'" />
<xsl:variable name="qeo" select="';'" />
<xsl:variable name="qend" select="'"
'" />
<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>
</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 </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> </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屋!
查看全文