使用XSLT从XML中提取namespace-prefix

时间:2011-12-09 17:08:53

标签: xslt xml-namespaces

我有一个SOAP XML。我需要将XML转换为变量,然后我必须使用XSLT从该变量中提取名称空间前缀。

例如,如果我的XML是,

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:out="http://soap.sforce.com/2005/09/outbound" xmlns:urn="urn:sobject.enterprise.soap.sforce.com">
    <soapenv:Header/>
    <soapenv:Body>
        <a>
            <s>sakdjhkjh</s>
            <j>jhgkjhkjd</j>
        </a>
    </soapenv:Body>
</soapenv:Envelope>

我必须将它带入一个名为input(<xsl:variable name="input"><xsl:copy-of select="."/></xsl:variable>)的变量。

现在,从这个变量($ input),我必须提取命名空间前缀'soapenv'。

如果我的数据是,

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:out="http://soap.sforce.com/2005/09/outbound" xmlns:urn="urn:sobject.enterprise.soap.sforce.com">
    <soap:Header/>
    <soap:Body>
        <a>
            <s>sakdjhkjh</s>
            <j>jhgkjhkjd</j>
        </a>
    </soap:Body>
</soap:Envelope>

然后我必须在我的XSLT输出中获取soap。

有人可以帮助我。

谢谢,

纳杰马

2 个答案:

答案 0 :(得分:0)

使用XSLT 1.0时,您应该使用<xsl:variable name="input" select="."/>而不是您拥有的那个,否则无法进行任何路径访问(因为您的变量在XSLT 1.0中包含结果树片段)。至于前缀,您可以尝试substring-before(name($input/descendant-or-self::*), ':')

答案 1 :(得分:0)

在这些情况下,您还可以使用极少需要的namespace轴。命名空间节点的值是命名空间URI,命名空间节点的名称是命名空间前缀。为清楚起见,名称空间URI被定义为随后被引用的变量。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">

        <!-- variable definitions -->
        <xsl:variable name="input" select="."/>
        <xsl:variable name="nsUri" select="'http://schemas.xmlsoap.org/soap/envelope/'"/>

        <!-- getting the namespace prefix -->
        <xsl:value-of select="name($input/*/namespace::*[. = $nsUri])"/>
    </xsl:template>
</xsl:stylesheet>

(虽然不常见,某个名称空间URI可以有多个前缀,但前面的文本中可以重新定义前缀,并且元素可以使用绑定到同一名称空间的不同前缀。此示例代码在根元素中搜索名称空间定义并返回给定URI的第一个前缀。)