在针对单独节点集的for-each循环中访问原始节点集

时间:2012-11-25 01:16:25

标签: xml xslt foreach node-set

我正在使用XSLT 1.0。我基本上试图根据属性的值创建输出。这是我正在转换的XML的一个例子:

<object include="name number" id="5" />

这是“id”属性引用的数据示例:

<People>

  ...

  <row>
    <id>5</id>
    <number>1455210</number>
    <name>Mike</name>
    <age>38</age>
    <city>London</city>
  </row>

  ...

</People>

以下是我的代码的一部分:

<xsl:template match="object">
  <param name="id" select="@id" />
  <param name="filename">
    ...
  </param>

  ...

  <xsl:apply-templates select="document($filename)//row[id=$id]">
    <xsl:with-param name="include" >
      <xsl:call-template name="tokenize">
        <xsl:with-param name="string" select="@include" />
      </xsl:call-template>
    </xsl:with-param>
  </xsl:apply-templates>
</xsl:template>

<xsl:template match="row">
  <xsl:param name="include" />

  <xsl:for-each select="exsl:node-set($include)/token">
    <span type="{.}">
      INSERT VALUE OF ORIGINAL NODE HERE (i.e. the value of the child of the "row" node with name current() or ".")
    </span>
  </xsl:for-each>
</xsl:template>

<xsl:template name="tokenize">
  <param name="string" />

  Turn a string with multiple values (i.e. "car dog hat") into an XML string
</xsl:template>

除了使用$ id而不是@id之外,我的问题是在我进入for-each循环后引用传递给“row”模板的节点。鉴于原始XML,我希望得到以下输出:

<span type="name">Mike</span>
<span type="number">1455210</span>

相反,我只能设法获得以下内容:

<span type="name">name</span>
<span type="number">number</span>

我可以使用一堆“if”语句而不是标记化任何内容,但“include”属性中项目的顺序很重要,所以我觉得我需要一个节点集。

任何帮助或更好的解决方法都将非常感激。谢谢!

1 个答案:

答案 0 :(得分:3)

将外部上下文节点存储在变量

<xsl:template match="row">
  <xsl:param name="include" />
  <xsl:variable name="curRow" select="."/>

然后,您可以在模板中的任何位置访问$curRow,包括内部for-each。