xslt将属性添加到xml根节点

时间:2016-02-26 09:04:41

标签: xml xslt xslt-1.0 xml-namespaces

我有一个XML:

<doc>
   <tag1>
      <tag11>1</tag11>
      <tag12>abc</tag12>
      <tag13>test</tag13>
      <tag14>content</tag14>
      <tag15>2-</tag15>
      <tag16>content</tag16>
      <tag17>
         <tag171>TITLE</tag171>
         <tag172>T3</tag172>
         <tag173>No</tag173>
      <tag17>
      <tag18 id="t/9905">aaa</tag18>
      <tag18 id="t/9905">bbb</tag18>
   </tag1>
   <tag2>
      <tag21>2016</tag21>
      <tag22>
         <tag221>1</tag221>
         <tag222>OMG</tag222>
      </tag22>
      <tag23>
         <tag231>Test</tag231>
         <tag232>2016-01-18T00:00:00</tag232>
         <tag233>This is a test</tag233>
      </tag23>
   </tag2>
</doc>

我想在根元素:/ doc中添加一个属性(名称空间),使得输出看起来像:

<doc xmlns="urn:test">
   <tag1>
      <tag11>
         <othertags />
      </tag11>
   </tag1>
   <tag2>
      <tag21>
         <othertags2 />
      </tag21>
   </tag2>
</doc>

我尝试了三个xslt(跳过默认副本所有部分以减少问题的长度)。

xslt1:见下文,问题是空命名空间xmlns =&#34;&#34;被添加到/ doc的所有子节点(即:/ doc / tag1和/ doc / tag2)

<xsl:template match="/doc">
   <xsl:element name="{local-name()}" namespace="urn:test" >
      <xsl:copy-of select="attribute::*"/>
         <xsl:apply-templates select="@*|node()" />
   </xsl:element>
</xsl:template>

Xslt2:见下文,问题是&#34; ns&#34;添加到根节点:和

<xsl:template match="/*"> 
   <xsl:element name="ns:{local-name()}" namespace="urn:test"> 
      <xsl:apply-templates select="node()|@*" /> 
   </xsl:element> 
</xsl:template> 

xslt3:见下文,问题是报告错误:未定义的命名空间前缀&#39; urn&#39;。 XPST0081:表达式中使用的名称空间前缀必须可以使用静态已知的名称空间扩展为名称空间URI。

<xsl:template match="/*">
   <xsl:copy>
      <xsl:attribute name="xmlns">
         <xsl:value-of select="urn:test" />
      </xsl:attribute>
   <xsl:copy-of select="@*" />
   <xsl:apply-templates />
   </xsl:copy>
</xsl:template> 

我只想要一个简单的输出xmlns =&#34; urn:test&#34;使用根节点/ doc。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

  

我想在根元素

中添加一个属性(名称空间)

名称空间声明属性。此处所需的更改不仅仅是根元素:在root上声明的命名空间由其所有后代继承。这意味着您需要将所有元素移动到新的命名空间中:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="*">
    <xsl:element name="{local-name()}" namespace="urn:test">
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>