获取命名空间的前缀

Getting prefix of a namespace

我正在开发一个应用程序,我需要将几个元素添加到我收到的 header soap 消息中。问题是我不知道我用来添加这些元素的命名空间使用的是哪个前缀,但可以肯定 body 中会有几个元素使用这个前缀,所以命名空间已经在留言。

例如,我收到这条消息:

<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>

我用来在 header 中添加这些元素的 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) urn:enterprise.soap.sforce.com

你能帮帮我吗?

我相信像 <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']">