我正在努力应该是一个简单的XSL:从下面的消息中复制updateResponse(注意:我需要XPATH 1.0语法来实现我的集成系统兼容性):
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:enterprise.soap.sforce.com" xmlns:n="urn:enterprise.soap.sforce.com">
<soapenv:Body>
<updateResponse>
<result>
<id>001S000000J1Bu0IAF</id>
<success>true</success>
</result>
</updateResponse>
</soapenv:Body>
</soapenv:Envelope>
我只想要结果结构:
<updateResponse xmlns="urn:enterprise.soap.sforce.com">
<result>
<id>001S000000J1Bu0IAF</id>
<success>true</success>
</result>
</updateResponse>
我能够复制soap对象,但是没有成功复制soapenv:Body元素的子元素。第一个副本适用于Body,但第二个副本不能解析XPATH。我的XMLSPY工具xpath查询编辑器说xpath有效,但XSL无法解析。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:urn="enterprise.soap.sforce.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<xsl:namespace-alias stylesheet-prefix="soapenv" result-prefix="foo"/>
<xsl:template match="/">
<xsl:apply-templates select="/soapenv:Envelope/soapenv:Body/urn:updateResponse"/>
</xsl:template>
<xsl:template match="/soapenv:Envelope/soapenv:Body/urn:updateResponse">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
此样式表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<xsl:template match="/soapenv:Envelope/soapenv:Body//*">
<xsl:element name="{local-name()}"
namespace="urn:enterprise.soap.sforce.com">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
输出:
<updateResponse xmlns="urn:enterprise.soap.sforce.com">
<result>
<id>001S000000J1Bu0IAF</id>
<success>true</success>
</result>
</updateResponse>
注意:首先,样式表中的命名空间声明是错误的。它应该是xmlns:urn="urn:enterprise.soap.sforce.com"
。其次,要获得准确的结果,您需要在范围命名空间中删除(有三个:xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
,xmlns="urn:enterprise.soap.sforce.com"
(默认)和xmlns:n="urn:enterprise.soap.sforce.com
)
答案 1 :(得分:1)
您的数据库和样式表之间的命名空间不匹配,这似乎是唯一的问题。
在样式表文档中,更改此内容:
xmlns:urn="enterprise.soap.sforce.com"
到此:
xmlns:urn="urn:enterprise.soap.sforce.com"
然后它将匹配原始输入文件中声明的命名空间。
答案 2 :(得分:0)
本文档中的命名空间很奇怪;你有xmlns和xmlns:n都分配给相同的命名空间。看起来//soapenv:updateResponse
应该可行。你试过了吗?