[英]XSL Add Attribute (not namespace) to XML root while copy whole document
谁能告诉我一个更好的解决方案,即在复制整个xml时向xml根添加属性。
简单的XML结构来说明任务
<MYROOT test1="someattribute1" test2="someattribute2">
<SOMEDATA>
<DATA>...</DATA>
<DATA>...</DATA>
</SOMEDATA>
</MYROOT>
要求的解决方案
实际解决方案
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="rootname" select="local-name(*)"/>
<xsl:element name="{($rootname)}">
<xsl:attribute name="staticobject" select="'true'"/>
<xsl:copy-of select="//*/node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
实际结果
<MYROOT staticobject="true">
<SOMEDATA>
<DATA>...</DATA>
<DATA>...</DATA>
</SOMEDATA>
</MYROOT>
预期结果
<MYROOT test1="someattribute1" test2="someattribute2" staticobject="true">
<SOMEDATA>
<DATA>...</DATA>
<DATA>...</DATA>
</SOMEDATA>
</MYROOT>
谁能告诉我一个更好的解决方案? 使用此解决方案,如果存在,我将从根目录中丢失所有其他属性。
我只想将属性添加到xml,而同时处理整个xml文档。
它必须是一个更好的解决方案,以便解决该问题。
感谢大伙们
如果要操纵根元素,请为此编写一个模板:
<xsl:template match="/*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:attribute name="staticobject" select="'true'"/>
<xsl:copy-of select="node()"/>
</xsl:copy>
</xsl:template>
通常,最好使用<xsl:apply-templates/>
代替<xsl:copy-of select="node()"/>
并添加身份转换模板,这样您便可以轻松地为其他更改添加更多模板。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:attribute name="staticobject" select="'true'"/>
<xsl:copy-of select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.