当前位置: 首页 > 知识库问答 >
问题:

xslt向xml根节点添加属性

裴俊能
2023-03-14

我有一个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=”“添加到/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:见下文,问题是“ns”被添加到根节点:和

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

xslt3:请参见下文,问题是报告了错误:未定义名称空间前缀“urn”。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> 

我只需要根节点/doc的xmlns=“urn:test”的简单输出。

任何帮助都将不胜感激!

共有1个答案

傅正豪
2023-03-14

我想向根元素添加一个属性(名称空间)

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

<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>
 类似资料:
  • 我正在将XML返回到一个jsp页面。 最终的XML结构如下所示: 的根节点作为向量返回,我使用xtream将其别名为“tasks”,如上图所示。 如何使用XStream实现这一点?我需要使用XSLT文件来转换XML输出吗?完成这一点的最佳方法是什么?

  • 我试图添加一个属性到一个节点,它是CDATA的一部分。我的XML是 结果应该是xml 文档节点中的id属性应作为属性添加到CDATA中的节点。 我能够以字段[@name='CDATA']的形式获取CDATA值,但我不确定如何将文档的属性添加到CDATA中。。 谁能给我建议一下怎么做,或者给我指出正确的方向?

  • 我是XSLT新手。我想根据其他子节点的条件更改XML中的根节点。但子节点始终保持不变。例如,我有以下XML: 我喜欢将XML更改为: 这意味着依赖于<代码> 我不想在每个<代码>

  • 问题内容: 我想向现有的xml节点添加属性。我不想向xml文件添加新元素(新节点),我只想添加新属性。我怎样才能做到这一点? 特别是我尝试了以下代码行: 但是我得到以下异常: 问题答案: 在DOM解析器中,这非常容易。获取您的节点,只需使用此功能。 然后最后更新您的文档。像这样..

  • 我正在将XML导入Access数据库。在转换过程中,数据之间的所有关系都会丢失。使用XSLT,我通过子节点将ID永久化。使用它,其中Id是添加到子节点的父元素: 我使用这种方法遇到的问题是父节点之外还有其他元素也具有元素或其变体,例如或类似的东西。当我尝试在上面的代码之外使用它时,的一些实例在以前的节点中丢失了。 很抱歉,我不知道在这里使用合适的语言,因为我对XSLT/XML不太熟悉。。。但我试图

  • 问题内容: 如果我想向根元素记录添加属性,可以从sql端执行此操作吗? 我想产生这样的xml: 问题答案: 使用新的语法: 这会给像 在这里阅读更多关于它的信息: 使用T-SQL创建XML文件的简单示例 将XML序列化与SQL的FOR XML PATH一起使用