选择与字符串变量名称匹配的节点集(属性或元素)

时间:2009-08-19 14:08:03

标签: xml xslt xpath

考虑这个简单的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. 评估变量属性 - 键入(或param,如果你想挑剔)作为字符串'foo'
  2. 调用值 - 就像我调用了&lt; xsl:value-of select =“foo”/&gt;

即。我想要它打印的是:

1

问题:我怎样才能实现这种行为?

注意:我知道我在这个简单的情况中可以将实际的属性节点作为参数传递(即&lt; xsl:with- param name =“attribute”select =“foo”/&gt;)。但这不是我要寻找的解决方案。我只需传递有关属性类型的信息(或属性名称,如果您更愿意将其称为)

我实际上要做的是创建一个通用的功能模板,它可以:

  1. 使用attribute-type作为参数
  2. 调用函数(call-template)
  3. 在函数中执行一系列操作,这些操作为我提供了一个存储在变量
  4. 中的节点集
  5. 求和节点集中元素的所有属性,这些属性属于先前选择的属性类型

&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;

1 个答案:

答案 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,因为那是它是什么。