使用XSLT 2.0进行两阶段转换

1 xslt xslt-2.0

我试图将CSV文件作为输入并将其转换为XML.我是XSLT的新手,我找到了一种将CSV转换为XML的方法(使用Andrew Welch的一个例子),如下所示:

输入CSV文件:

car manufacturer,model,color,price,inventory
subaru,outback,blue,23195,54
subaru,forester,silver,20495,23
Run Code Online (Sandbox Code Playgroud)

我的输出XML将是:

<?xml version="1.0" encoding="UTF-8"?>
<rows>
   <row>
      <column name="car manufacturer">subaru</column>
      <column name="model">outback</column>
      <column name="color">blue</column>
      <column name="price">23195</column>
      <column name="inventory">54</column>
   </row>
   <row>
      <column name="car manufacturer">subaru</column>
      <column name="model">forester</column>
      <column name="color">silver</column>
      <column name="price">20495</column>
      <column name="inventory">23</column>
   </row>
</rows>
Run Code Online (Sandbox Code Playgroud)

我想要的输出实际上类似于:

<stock>
   <model>
      <car>subaru outback</car>
      <color>blue</color>
      <price>23195</price>
      <inventory>54</inventory>
   </model>
   <model>
      <car>subaru forester</car>
      <color>silver</color>
      <price>20495</price>
      <inventory>23</inventory>
   </model>
</stock>
Run Code Online (Sandbox Code Playgroud)

我读到的是最好用两相变换完成.CSV到XML是使用XSLT 2.0完成的,所以我认为在不使用节点集函数的情况下也可以使用它完成两个阶段的转换.

因此,第一阶段是将原始CSV文件作为输入,然后输出上面显示的中间XML.然后获取该中间XML,并将其传递给另一个转换以获得所需的输出.

任何人都可以帮助完成两阶段转换?我无法将第一阶段的输出作为第2阶段的输入传递?

到目前为止我有这样的事情:

<xsl:import href="csv2xml.xsl"/>
<xsl:output method="xml" indent="yes" />

<xsl:variable name="intermediate">
    <xsl:apply-templates select="/" mode="csv2xml"/>
</xsl:variable>

<xsl:template match="rows" name="main">

 **[This is what I'm having trouble with]**

</xsl:template>
Run Code Online (Sandbox Code Playgroud)

Mic*_*Kay 7

我没有看到任何理由为什么这种转换需要两个阶段 - 除了允许您重用其中一个阶段的现有代码.

但是,当您确实需要两个阶段时,一般模型是:

<xsl:template match="/">
  <xsl:variable name="phase-1-result">
    <xsl:apply-templates select="/" mode="phase-1"/>
  </xsl:variable>
  <xsl:apply-templates select="$phase-1-result" mode="phase-2"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

使用阶段1和阶段2的模板规则(及其应用模板调用)分别处于模式阶段1或阶段2.