我正在开发一个应用程序,我需要在我收到的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)。
答案 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']">