XSLT:使用另一个属性的值创建新属性

时间:2014-05-19 10:34:17

标签: xml xslt

我正在将一个XML转换为另一个XML。 让我们说我们开始的XML看起来像这样

<fruit id="123">
  <apple></apple>
  <banana></banana>
  <lemon></lemon>
</fruit>

现在在我转换的XML中,我想用旧XML中的id属性值创建一个新属性。

我试着这样做:

 <xsl:template match="fruit">
    <xsl:attribute name="reference">
         <xsl:value-of select="fruit/@id"/>   
    </xsl:attribute>
 </xsl:template>

我收到此错误:

cannot create an attribute node whose parent is a document node

有人可以向我解释我做错了什么,因为我不理解这个错误。 解决方案会很好。

谢谢!

2 个答案:

答案 0 :(得分:3)

问题是文档节点不能具有属性,并且您没有在输出树中为要应用的属性创建元素。文档节点还必须具有单个Element子项。

以下内容应该有效。

<xsl:template match="fruit">
    <fruit>
        <xsl:attribute name="reference">
             <xsl:value-of select="@id"/>   
        </xsl:attribute>
    </fruit>
 </xsl:template>

答案 1 :(得分:1)

错误消息告诉您,您无法在此处创建属性节点,因为它没有属于它的元素。只有当你在一个元素内部(在输出意义上)你还没有创建任何子节点(元素,文本节点,注释或处理指令)时,才能创建属性节点)在那个元素下。

除此之外,你的XPath是错误的 - 你在匹配fruit元素的模板中,因此id属性的路径只是@id,而不是{ {1}}。