考虑这个简单的xml元素示例:
<parent foo="1" bar="2" foobar="3">
<child/>
</parent>
在xsl文件中,我处于“parent”的上下文中(即在&lt; template match =“parent”&gt;内)。我想基于字符串变量选择一个节点集(在该示例中,只有一个属性)。例如,我想选择一个与$ attribute-name匹配的节点集。我将展示我失败的xsl示例,你可能会理解我正在尝试做什么。
<xsl:template match="parent">
<xsl:call-template name="print-value-of">
<xsl:with-param name="attribute-type" select="'foo'"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="print-value-of">
<xsl:param name="attribute-type"/>
<xsl:value-of select="$attribute-type"/>
</xsl:template>
打印输出:
foo
我首先想要做的事情(但我意识到这不是它应该做的)是:
即。我想要它打印的是:
1
问题:我怎样才能实现这种行为?
注意:我知道我在这个简单的情况中可以将实际的属性节点作为参数传递(即&lt; xsl:with- param name =“attribute”select =“foo”/&gt;)。但这不是我要寻找的解决方案。我只需传递有关属性类型的信息(或属性名称,如果您更愿意将其称为)
我实际上要做的是创建一个通用的功能模板,它可以:
&LT;编辑&gt;
我只能使用XSLT 1.0,因此更喜欢1.0解决方案!
&lt; / EDIT&gt;
&lt; EDIT2&gt;
关于类似主题的后续问题:是否也可以使用字符串变量指定的名称/类型创建a的属性?即。
<xsl:attribute name="$attribute-type"/>
像上面的行一样,结果是$ attribute-type是xml输出中属性的文字名称。相反,我希望它再次评估变量并将评估值作为名称 &lt; / EDIT2&gt;
答案 0 :(得分:3)
这将选择名称为'foo'
。
<xsl:call-template name="print-value-of">
<xsl:with-param name="attribute-type" select="@*[name() = 'foo']"/>
</xsl:call-template>
<xsl:template name="print-value-of">
<xsl:param name="attribute-type"/>
<xsl:value-of select="."/>
</xsl:template>
或者,您可以将<xsl:call-template>
保持原状并在模板中进行更改:
<xsl:template name="print-value-of">
<xsl:param name="attribute-type"/>
<xsl:value-of select="@*[name() = $attribute-type]"/>
</xsl:template>
在任何情况下,除非这只是一个合成的例子,所有上述内容都是一种非常昂贵的说法:
<xsl:value-of select="@*[name() = $attribute-type]"/>
编辑:
要使用动态名称创建属性,请使用:
<xsl:attribute name="{$attribute-type}">
<xsl:value-of select="$some-value-or-expression" />
</xsl:attribute>
请注意,花括号使XSLT处理器评估其内容(仅在属性值中)。
您应该确保$attribute-type
包含符合XML命名规则的字符串。你应该考虑将变量重命名为$attribute-name
,因为那是它是什么。