我有一个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。
有人可以帮助我。
谢谢,
纳杰马
答案 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的第一个前缀。)