在XSLT1.0之前的响应子字符串中提取主机名

时间:2016-03-16 16:38:20

标签: xslt soap xslt-1.0

我正在进行服务调用以从salesforce获取会话ID,我正在尝试从serverurl节点中提取主机名。

请求(基本上来自Saleforce的回复)

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns="urn:enterprise.soap.sforce.com" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <loginResponse>
            <result>
                <metadataServerUrl>https://hostname.my.salesforce.com/services/Soap/m/34.0/00Dn00000008evG</metadataServerUrl>
                <passwordExpired>false</passwordExpired>
                <sandbox>true</sandbox>
                <serverUrl>https://hostname.my.salesforce.com/services/Soap/c/34.0/00Dn00000008evG/0DFL000000001Vj</serverUrl>
                <sessionId>00Dn00000008</sessionId>
                <userId>test</userId>

            </result>
        </loginResponse>
    </soapenv:Body>
</soapenv:Envelope>

我正在尝试从hostname.my.salesforce.com获取此值<serverUrl>https://hostname.my.salesforce.com/services/Soap/c/34.0/00Dn00000008evG/0DFL000000001Vj</serverUrl>

我可以使用此

获取值
<xsl:variable name="serverUrl" select="substring-before(/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='loginResponse']/*[local-name()='result']/*[local-name()='serverUrl'],'/services/Soap/c/34.0/00DS0000003Kwbv/0DFL000000001Vj')"/>

问题是URI部分不断变化而不是匹配/services/Soap/c/34.0/00DS0000003Kwbv/0DFL000000001Vj有不同的方法来获取价值。

根据我所看到的情况,该URI始终首先/services/Soap/c/34.0以及之后的部分更改。

有人可以提供建议吗?

1 个答案:

答案 0 :(得分:1)

仅获取主机名的方法略有不同(不带前导https://的方法是:

select="substring-before( substring-after($servernode, 'https://'), '/')"

其中servernode类似于

<xsl:variable name="servernode" 
    select="*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='loginResponse']/*[local-name()='result']/*[local-name()='serverUrl']"/>

顺便提一下,我建议在xslt中使用适当的名字声明来避免使用这个本地名称。