2

因此,我尝试使用 XSLT 将 SOAP 文档正文中的所有元素转换(提取)为 XML。这是我的 SOAP 文档(完整)

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="dealercode.xsl"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
        <AuthHeader xmlns="http://www.somedomain.com/">
            <LogonID></LogonID>
            <Password></Password>
        </AuthHeader>
    </soap:Header>
    <soap:Body>
        <getDealerCodeById xmlns="http://www.somedomain.com/">
            <BrokerCode>{ssQuoterBrokerCode(app_id)}</BrokerCode>
            <IDNumber>{dealerCode}</IDNumber>
        </getDealerCodeById>
    </soap:Body>
</soap:Envelope>

这是我的 XSLT 表。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<?xml-stylesheet type="text/xsl" href="dealercode2soap.xsl"?>

    <xsl:template match="/*">
<xsl:value-of select="soap:Body/s:getDealerCodeById"
     xmlns:soap="http://www.w3.org/2001/12/soap-envelope" 
     xmlns:s="http://somedomainname/" />

</xsl:stylesheet>

但输出不是我想要的。它仍在解析整个 SOAP 文档,而不仅仅是给我“soap:Body”元素中的内容,而且我还收到“未解析的命名空间前缀肥皂”的警告

我哪里错了?

编辑:我设法使用不同的代码块让它工作。见下文

<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
            xmlns ="http://www.somedomainename.com">

<xsl:template match="/">
    <xsl:apply-templates select="soap:Envelope/soap:Body/*"/>
</xsl:template>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

它现在在我的浏览器中输出正文部分的内容。我意识到的另一件最重要的事情是格式化是在服务器端完成的,但由于当时我无法访问服务器,所以我不知道我的代码是否正常工作。这是我正在寻找的所需输出(显然一直在工作。

    <?xml version="1.0" encoding="UTF-8"?>
<getDealerCodeById xmlns="http:///" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <BrokerCode>{ssQuoterBrokerCode(app_id)}</BrokerCode>
   <IDNumber>{dealerCode}</IDNumber>
</getDealerCodeById>
4

2 回答 2

2

您收到有关“未解析的名称空间前缀soap ”的警告,因为您尚未soap在XSLT 中声明名称空间。

此外,您的getDealerCodeById元素绑定到http://somedomainname/命名空间 uri。你可能没有注意到,因为它不使用命名空间前缀: xmlns="http://somedomainname/"

确保在 XSLT 中同时声明soap命名空间和http://somedomainname/命名空间,并调整 XPath 以使用您声明的任何命名空间前缀:

<xsl:template match="/*">
    <xsl:value-of select="soap:Body/s:getDealerCodeById"
         xmlns:soap="http://www.w3.org/2001/12/soap-envelope" 
         xmlns:s="http://somedomainname/" />
</xsl:template>
于 2013-05-13T13:28:48.250 回答
0

修改您问题中的代码意味着我们看不到 Mads 回答了什么问题,这使得跟踪该线程变得非常困难。但是你的代码现在的情况是你将soap前缀绑定到源文档和样式表中的不同名称空间,这不是非法的,但肯定会令人困惑,而且不太可能是你想要的。somedomain.com 的命名空间也不匹配。

我希望这些错误的影响是您的样式表不输出任何内容。我不知道您所说的“它正在解析整个文档”是什么意思 - 样式表总是解析整个输入文档。您的意思是它正在输出整个输入文档吗?这肯定与您的代码不一致。

于 2013-05-13T19:49:15.357 回答