我正在尝试使用xsltproc将XML转换为CSV。
我目前有
--XSL template
<xsl:strip-space elements="*" />
<xsl:template match="/*/child::*">
<xsl:for-each select="child::*">
<xsl:if test="position() != last()">"<xsl:value-of select="normalize-space(.)"/>", </xsl:if>
<xsl:if test="position() = last()">"<xsl:value-of select="normalize-space(.)"/>" <xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
--XML (they are two separate files
<root>
<summary>
<field1>a</field1>
<field2>b</field2>
<field3>c</field3>
<field4>d</field4>
<data>
<field5>e</field5>
<field6>f</field6>
</data>
<user_info>
<field7>g</field7>
<field8>h</field8>
</user_info>
</summary>
</root>
但是如何包含来自 XML 的嵌套元素呢?我有 3 个嵌套元素。
目前我正在得到"字段 1"、"字段 2"、"字段 3"、"字段 4"、"字段 5,6,7,8,9,10"
我想看看
field1, field 2, field 3, field 4, field 5, field 6, field 7, field 8
"a", "b", "c", "d", "e", "f", "g", "h"
将所有名称以"field"开头的元素存储在变量中。然后,对 $fields
的内容进行两次迭代。第一次,输出所有元素名称,第二次输出每个元素的内容。
这样,您就不必干预嵌套结构。这一行:
<xsl:if test="position() != last()">
确保在处理最后一个元素时不插入逗号。
假设输入正确(元素名称中没有空格),这是一个可能的解决方案:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="fields" select="//*[starts-with(name(),'field')]"/>
<xsl:template match="/root">
<xsl:for-each select="$fields">
<xsl:value-of select="name()"/>
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text> </xsl:text>
<xsl:for-each select="$fields">
<xsl:text>"</xsl:text>
<xsl:value-of select="."/>
<xsl:text>"</xsl:text>
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
提供以下输出:
field1, field2, field3, field4, field5, field6, field7, field8
"a", "b", "c", "d", "e", "f", "g", "h"