XPath选择节点多次依赖于XSL转换的属性

时间:2012-01-05 10:25:12

标签: xml xslt xpath

我有一个像这样的节点:

<foo my:first="yes" my:second="no">text</foo>

我需要一个XPath查询或XSLT函数,它在“my”命名空间中选择具有属性的每个节点。但是如果一个元素有多个“my”属性,则需要多次选择该元素。

目前我有这个:

<xsl:template match="//*[@my:*]">
  <bar>
    <xsl:variable name="attributeName" select="local-name(./@my:*)" />
    <xsl:variable name="attributeValue" select="./@my:*" />
    <xsl:attribute name="name">
      <xsl:value-of select="$attributeName" />
    </xsl:attribute>
    <xsl:attribute name="value">
      <xsl:value-of select="$attributeValue" />
    </xsl:attribute>
    <xsl:value-of select="." />
  <bar>
</xsl:template>

当然,它只支持单个“我的”属性,这会导致这样的转换:

<bar name="attr_in_my_namespace" value="value_of_that_attr">text</bar>

如果我尝试使用我在开头提供的节点,我会收到以下错误:

A sequence of more than one item is not allowed as the first argument of
  local-name() (@my:first, @my:second) 

所以,预期的结果是:

<bar name="first" value="yes">text</bar>
<bar name="second" value="no">text</bar>

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

在我看来,好像你只想处理属性节点,例如

<xsl:template match="*/@my:*">
  <bar name="{local-name()}" value="{.}">
    <xsl:value-of select=".."/>
  </bar>
</xsl:template>

然后

<xsl:template match="*[@my:*]">
  <xsl:apply-templates select="@my:*"/>
</xsl:template>