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

时间:2017-04-04 12:16:22

标签: xml xslt

任何人都可以告诉我一个更好的解决方案,在复制整个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添加属性。

它必须是一个更好的解决方案才能解决这个问题。

谢谢你们

2 个答案:

答案 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>