如何在数组中存储值并在以后的XSL中使用它?

时间:2011-12-07 23:57:22

标签: xml xslt-1.0

我想知道如何将XML中的值存储到XSL中的数组变量,并使用这些数组创建新的XML文件。

使用XSL 1.0版,这是一个例子:

使用XSL将sample1.xml转换为sample2.xml

sample1.xml

<root>
    <transfer>A</transfer>
    <station>A</station>
    <transfer>B</transfer>
    <station>B</station>
    <transfer>C</transfer>
    <station>C</station>    
</root>

sample2.xml

<root>
    <fund>A</fund>
    <place>A</place>
    <fund>B</fund>
    <place>B</place>
    <fund>C</fund>
    <place>C</place>    
</root>

因此,我需要将<transfer>标记中的所有值存储到数组中,并将值放入<fund>标记。

到目前为止,我从一个XML文件中提取了值,并将值放在另一个XML文件中。

如何将这些项目放入数组?

2 个答案:

答案 0 :(得分:3)

正如Jeff Mercado所述,您不需要存储任何值来解决手头的任务,,因为用两个ranaming模板覆盖身份规则会产生想要的结果。

但是,在具有“阵列”功能的其他任务中使用起来非常方便。

通常,您可以定义一个变量以包含一组特定的节点,这些节点可以通过它们的位置(按文档顺序)访问,在谓词中指定此位置。

以下是一个示例

<xsl:variable name="vTransfers" select="/*/transfer"/>

定义了一个名为vTransfers的变量,其值为所有transfer元素的节点集,每个元素都是XML文档顶部元素的子元素。

,然后

$vTransfers[1]

选择$vTransfers中包含的第一个元素。

$vTransfers[2]

选择$vTransfers,...

中包含的第二个元素
$vTransfers[position() = $k]

$vTransfers中选择节点,其位置按文档顺序等于变量$k中包含的值。

答案 1 :(得分:2)

我不明白为什么你需要一个数组。你只是重命名元素。只需使用这些转换:

<xsl:template match="transfer">
  <fund><xsl:value-of select="."/></fund>
</xsl:template>

<xsl:template match="station">
  <place><xsl:value-of select="."/></place>
</xsl:template>