XSLT:向根元素添加名称空间声明

sch*_*rps 3 xslt xslt-1.0

我有这个XML文档:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="AcquisitionFolder">
            <Directory Id="dir2EE87E668A6861A2C8B6528214144568" Name="bin" />
            <Directory Id="dir99C9EB95694B90A2CD31AD7E2F4BF7F6" Name="Decoders" />
        </DirectoryRef>
    </Fragment>
</Wix>
Run Code Online (Sandbox Code Playgroud)

我想获得以下结果:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension>
    <Fragment>
        <DirectoryRef Id="AcquisitionFolder">
            <Directory Id="dir2EE87E668A6861A2C8B6528214144568" Name="bin" />
            <Directory Id="dir99C9EB95694B90A2CD31AD7E2F4BF7F6" Name="Decoders" />
        </DirectoryRef>
    </Fragment>
</Wix>
Run Code Online (Sandbox Code Playgroud)

这似乎是一个简单的问题,但我没有找到解决方案:-(我做了几次尝试,并发现了几个类似的问题(例如:XSLT:将命名空间添加到根元素),但它们并没有帮助我.

谢谢你的建议!

Stu*_*tLC 6

在许多情况下,您可以简单地将命名空间嵌入到投影的Xml元素(包括根)中,作为文字结果元素的一部分:

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

    <xsl:template match="/*[local-name()='Wix']">
        <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
             xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
            <xsl:copy-of select="node()|@*"/>
        </Wix>
     </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

更正式/通常,输出xml中的任何名称空间都可以添加到样式表自己的声明中(全局或使用名称空间别名),例如

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:wix="http://www.foo.com/2001/v1"
    ...other namespaces here>
Run Code Online (Sandbox Code Playgroud)

...然后在输出中引用

<xsl:template match="/">
    <wix:Wix>
       <wix:Child>
          ...
Run Code Online (Sandbox Code Playgroud)

如果在结果输出中存在不需要/未使用的名称空间(例如,在源文档中需要,但不在输出文档中),则可以使用 exclude-result-prefixes

  • 对我感到羞耻.为什么我不想这么简单的解决方案?谢谢您的帮助 !!! (2认同)