XSLT:动态设置xmlns uri



我是xslt的新手,我需要能够动态地将uri注入xmlns。我必须使用1.0版本。环顾四周,我发现https://www.oxygenxml.com/archives/xsl-list/200701/msg00185.html似乎显示如何做我想做的事情,但是,我无法弄清楚如何做到这一点

<xsl:stylesheet version="1.0"
xmlns:xsl="http://w3.org/1999/XSL/Transform"
>
<xsl:output method="xml" encoding="utf-8" indent="yes" />
<xsl:param name="someparam">
<xsl:param uri=dynamic uri>
<xsl:template name="envelope" match="/">
<soapenv:Envelope xmlns:soapenv="http://sxhemas.xmlsoap.org/soap/envelope/"
xmlns:some="http://someurl"
xmlns:dynamic="dynamically injected uri"
xmlns:dynamic2="dynamically injected uri">
<soapenv:Header>
<some:Data>
</Data>
</soapenv:Header>
<soapenv:Body>
<dynamic:methodCall>
<dynamic2:Param><xsl:value-of select="$someparam"/></dynamic2:Param>
</dynamic:methodCall>
</soapenv:Body>
</soapenv:Envelope>
</xsl:template>
</xsl:stylesheet>

我想知道如何为dynamic和dynamic2设置uri

考虑下面的简化示例:

XSLT 1.0

<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:param name="dyn-uri">example.com/123</xsl:param>
<xsl:template match="/">
<soapenv:Envelope xmlns:soapenv="http://sxhemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<xsl:element name="dynamic:methodCall" namespace="{$dyn-uri}">
<xsl:value-of select="123"/>
</xsl:element>
</soapenv:Body>
</soapenv:Envelope>
</xsl:template>
</xsl:stylesheet>

在大多数(如果不是所有的话)XSLT处理器中,这将产生:结果

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://sxhemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<dynamic:methodCall xmlns:dynamic="example.com/123">123</dynamic:methodCall>
</soapenv:Body>
</soapenv:Envelope>

此结果在语义上与:

相同
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://sxhemas.xmlsoap.org/soap/envelope/" xmlns:dynamic="example.com/123">
<soapenv:Header/>
<soapenv:Body>
<dynamic:methodCall>123</dynamic:methodCall>
</soapenv:Body>
</soapenv:Envelope>

,这似乎是您期望的结果。任何符合标准的XML解析器都会将这两个文档解析成一个相同的树。