我正在使用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”属性中项目的顺序很重要,所以我觉得我需要一个节点集。
任何帮助或更好的解决方法都将非常感激。谢谢!
答案 0 :(得分:3)
将外部上下文节点存储在变量
中<xsl:template match="row">
<xsl:param name="include" />
<xsl:variable name="curRow" select="."/>
然后,您可以在模板中的任何位置访问$curRow
,包括内部for-each。