繁体   English   中英

XSL在复制整个文档时将属性(不是名称空间)添加到XML根目录

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM