【发布时间】:2018-03-11 06:20:40
【问题描述】:
例如,我有一个具有以下结构的 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<MainItem>
<Field1>1</Field1>
<Field2>2</Field2>
<SubItem>
<SubField1>1</SubField1>
<SubField2>2</SubField2>
</SubItem>
<SubItem>
<SubField1>3</SubField1>
<SubField2>4</SubField2>
</SubItem>
</MainItem>
我确信在 XML 文件中总是只有一个 MainItem。同时,一个MainItem 可能有多个SubItem 元素。
我希望能够使用 XSLT 将此 XML 转换为 CSV。下面是我当前的 XSLT 脚本:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:text>Field1,Field2</xsl:text>
<xsl:text> </xsl:text>
<xsl:for-each select="MainItem">
<xsl:value-of select="Field1"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="Field2"/>
<xsl:text> </xsl:text>
</xsl:for-each>
此 XSLT 将 XML 转换为以下 CSV:
Field1,Field2
1,2
问题是如何使用 XSLT 将上述 XML 转换为 2 个 CSV 文件 - 第一个用于MainItem 元素,第二个用于SubItem?
我正在使用 .NET XslCompiledTransform 类来执行转换。
【问题讨论】:
-
如果您使用像 Saxon 9 或 XmlPrime 或 Altova 这样的 XSLT 2.0 处理器,您可以使用
xsl:result-document通过一次转换创建多个结果文档。如果您使用 XSLT 1.0 处理器,您需要检查它是否支持扩展元素来创建多个结果文档。 -
我不知道是否支持 XslCompiledTransform 通过一个转换创建多个结果文档,而不是尝试使用扩展对象或脚本将创建委托给 .NET 代码。在这种情况下,编写两个单独的 XSLT 样式表然后使用 XSLT 之外的 .NET 代码分别运行两个样式表以创建两个 CSV 文件可能更容易。但是,使用 .NET,您可以选择通过切换到 Saxon 9(HE 版本是开源的,在 NuGet 上可用)或 XmlPrime 或 Altova 来迁移到 XSLT 2.0 或 3.0。
-
感谢您的评论,我将在 Saxon HE 中使用 XSLT 2.0。