我正在使用 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”属性中项目的顺序很重要,所以我觉得我需要一个节点集。
任何帮助或解决此问题的更好方法将不胜感激。谢谢!