我有一个像这样的节点:
<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>
我怎样才能做到这一点?
答案 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>