0

我正在使用 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 循环后引用传递给“行”模板的节点。鉴于原始 XML,我希望得到以下输出:

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

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

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

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

任何帮助或解决此问题的更好方法将不胜感激。谢谢!

4

1 回答 1

3

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

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

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

于 2012-11-25T01:49:14.017 回答