变量使用命名空间定义

时间:2018-04-27 08:13:39

标签: xml xslt namespaces

我需要在我的xslt中使用它,但是xmlns:s =" {$ service-uri}"没有提取:


    <xsl:variable name="service-uri" select="'http://something/'"/>
    ...
    <xsl:template match="cxf:cxfEndpoint[last()]">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>     
        </xsl:copy>
        <cxf:cxfEndpoint 
            xmlns:s="{$service-uri}"
            endpointName="s:{$service-name}Port"
            id="{$service-name}_RemoteEndpoint"
            serviceName="s:{$service-name}"
            wsdlURL="wsdl/remote/{$service-name}.wsdl">
            <cxf:properties>
                <entry key="continuationTimeout" value="120000"/>
                <entry key="mtom-enabled" value="true"/>
                <entry key="dataFormat" value="PAYLOAD"/>
            </cxf:properties>
        </cxf:cxfEndpoint>
    </xsl:template>

如何在命名空间定义中提取service-uri变量? 谢谢 ZAMEK

1 个答案:

答案 0 :(得分:1)

属性值模板不能用于名称空间声明。请记住,XSLT是XML,XML解析器和XSLT处理器必须理解命名空间声明xmlns:x="..."

在XSLT 2.0中,您可以使用xsl:namespace指令动态创建命名空间节点:

<xsl:namespace name="s" select="$service-uri"/>

如果你在1.0中,那就更难了。您可以通过在相关命名空间中创建元素节点来实现:

<xsl:variable name="dummy">
  <xsl:element name="s:dummy" namespace="{$service-uri}"/>
</xsl:variable>

然后将相关的命名空间节点复制到新元素:

<xsl:copy-of select="exslt:node-set($dummy/*/namespace::s)"/>