获取命名空间的前缀

时间:2015-01-08 17:13:02

标签: xslt xpath

我正在开发一个应用程序,我需要在我收到的soap消息的标题中添加几个元素。问题是我不知道我用于添加这些元素的命名空间使用了哪个前缀,但是它肯定会在使用此前缀的正文中有几个元素,因此命名空间已在消息中声明。

例如,我收到此消息:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:enterprise.soap.sforce.com" xmlns:urn1="urn:sobject.enterprise.soap.sforce.com">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:operation>
      </urn:operation>
   </soapenv:Body>
</soapenv:Envelope>

我用于在标题中添加这些元素的xpath表达式是:

<xsl:stylesheet version="1.0" exclude-result-prefixes="xsi xsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>

    <xsl:param name="Getsed">aBcDeFgHiJkLmNñOpQrStUvWxYz</xsl:param>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="//*[local-name()='Header']">  
        <xsl:copy>
           <urn:SH xmlns:urn="urn:enterprise.soap.sforce.com">
             <urn:sed><xsl:value-of select="$Getsed"/></urn:sed>
           </urn:SH>
           <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>     
    </xsl:template>    

</xsl:stylesheet>

我想使用已为名称空间urn:enterprise.soap.sforce.com声明的前缀(urn)。

你可以帮我一把吗?

1 个答案:

答案 0 :(得分:1)

我认为像<xsl:value-of select="substring-before(name(//*[namespace-uri() = 'urn:enterprise.soap.sforce.com']), ':')" />这样愚蠢的解决方法可以满足您的需求。

因此,您的模板可以通过以下方式重写:

  <xsl:template match="*[local-name()='Header']">
    <!-- this will retrieve the namespace prefix in source document -->
    <xsl:variable name="ns-sforce">
       <xsl:value-of select="substring-before(name(//*[namespace-uri() = 'urn:enterprise.soap.sforce.com']), ':')" />
    </xsl:variable>

      <xsl:copy>
         <!-- create prefixed elements with the same value as before -->
         <xsl:element name="{$ns-sforce}:SH" namespace="urn:enterprise.soap.sforce.com">
           <xsl:element name="{$ns-sforce}:sed" namespace="urn:enterprise.soap.sforce.com">
             <xsl:value-of select="$Getsed"/>
           </xsl:element>
         </xsl:element>

         <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
  </xsl:template>

注意:<xsl:template match="//*[local-name()='Header']"> can be replaced by <xsl:template match="*[local-name()='Header']">

相关问题