2011-12-09 103 views
0

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

例如,如果我的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> 

我必须把它变成一个变量称为输入(<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输出。

有人可以帮我在这里。

谢谢你,

纳杰马

回答

0

很好用XSLT 1.0,你应该使用<xsl:variable name="input" select="."/>,而不是你有一个,否则做任何路径访问是不可能的(如您的变量包含一个结果树片段XSLT 1.0)。至于前缀,你可以试试substring-before(name($input/descendant-or-self::*), ':')

+0

谢谢。有效 :-) – user1090172

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的第一个前缀。)

相关问题