xslt 将属性添加到 xml 根节点
xslt Adding attribute to xml root node
我有一个 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: 看下面,问题是报错:Undefined namespace prefix '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" 的简单输出。
如有任何帮助,我们将不胜感激!
I want to add an attribute (namespace) to the root element
命名空间声明不是属性。此处所需的更改不仅仅是根元素:在根处声明的命名空间由其所有后代继承。这意味着您需要将 所有 元素移动到新的命名空间中:
<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:
<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: 看下面,问题是报错:Undefined namespace prefix '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" 的简单输出。
如有任何帮助,我们将不胜感激!
I want to add an attribute (namespace) to the root element
命名空间声明不是属性。此处所需的更改不仅仅是根元素:在根处声明的命名空间由其所有后代继承。这意味着您需要将 所有 元素移动到新的命名空间中:
<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>