XPATH挑战 - 想要复制内部元素

时间:2010-11-05 00:15:07

标签: xslt xpath

我正在努力应该是一个简单的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>

3 个答案:

答案 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应该可行。你试过了吗?