使用XSLT 1.0在XML中添加多个命名空间

时间:2013-09-30 20:46:06

标签: xml xslt

<application xmlns="http://someurl">
    <Detail1/>
    <Detail2>
    <Property/>
    </Detail2>
</application>

我正在尝试将xmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"添加到“应用程序根节点”。我试图在stackoverflow上关注很多链接,但似乎在XSLT 1.0中没有任何工作 有人可以帮我这个。

1 个答案:

答案 0 :(得分:3)

由于XSLT 1.0在XSLT 2.0中没有<xsl:namespace>指令,我使用的技术是从样式表中复制这些节点:

输入:

t:\ftemp>type ns.xml
  <application xmlns="http://someurl">
    <Detail1/>
    <Detail2>
    <Property/>
    </Detail2>
</application>

执行:

t:\ftemp>call xslt ns.xml ns.xsl
<?xml version="1.0" encoding="utf-8"?><application xmlns="http://someurl" xmlns:
xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchem
a-instance">
    <Detail1/>
    <Detail2>
    <Property/>
    </Detail2>
</application>

样式表:

t:\ftemp>type ns.xsl
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                version="1.0">

<xsl:template match="/*">
  <xsl:copy>
    <xsl:copy-of select="document('')/*/namespace::xs"/>
    <xsl:copy-of select="document('')/*/namespace::xsi"/>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="@*|node()"><!--identity for all other nodes-->
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>
t:\ftemp>