任何人都可以告诉我一个更好的解决方案,在复制整个xml时向xml root添加属性。
简单的XML结构来解释任务
<Table recCount="5" recLength="42">
<Rec recId="1">..</Rec>
<Rec recId="2">..</Rec>
<Rec recId="3">..</Rec>
<Rec recId="4">..</Rec>
<Rec recId="5">..</Rec>
</Table>
请求解决方案
实际解决方案
<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>
谁能告诉我一个更好的解决方案? 使用此解决方案,当它们存在时,我将丢失root的所有其他属性。
我只想在处理整个xml文档的同时向xml添加属性。
它必须是一个更好的解决方案才能解决这个问题。
谢谢你们
答案 0 :(得分:0)
如果你想操纵根元素,那么为它写一个模板:
<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()"/>
并添加身份转换模板,然后您可以轻松添加更多模板以供其他更改。
答案 1 :(得分:0)
<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>