SOAP xml响应的Xslt转换

时间:2014-05-04 12:05:26

标签: xml xslt soap

我是使用XSL的新手......我有一个SOAP响应: -

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <insertDataResponse xmlns="http://services.test.com/schema/MainData/V1">
         <Response>Done !!!</Response>
         <Id>0</Id>
         <Age>0</Age>
      </insertDataResponse>
   </soap:Body>
</soap:Envelope>

我正在使用以下XSL来转换响应: -

    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <xsl:template match="/">
    <soap:Envelope>
    <soap:Body>
            <insertDataResponse xmlns="http://services.test.com/schema/MainData/V1">
                <Response>
                    <xsl:value-of select="Response" />
                </Response>
                              <Id>
                   <xsl:value-of select="Id" />
              </Id>
              <Age>
                   <xsl:value-of select="Age" />
              </Age>
            </insertDataResponse>
            </soap:Body>
    </soap:Envelope>
   </xsl:template>
 </xsl:stylesheet>

现在......当我尝试在SOAP请求上执行XSL转换时......我得到以下输出: -

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <insertDataResponse xmlns="http://services.test.com/schema/MainData/V1">
            <Response />
            <Id />
            <Age />
        </insertDataResponse>
    </soap:Body>
</soap:Envelope>

我的属性没有任何价值......我做错了什么......我错过了什么......请帮忙......

1 个答案:

答案 0 :(得分:1)

你在匹配/的模板中,所以

<xsl:value-of select="Response" />

和类似的表达式在没有命名空间的情况下寻找名为Response根级元素,该元素不存在(文档元素名为Envelope并且在http://schemas.xmlsoap.org/soap/envelope/命名空间。)

您需要在样式表中使用前缀声明http://services.test.com/schema/MainData/V1命名空间:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:md1="http://services.test.com/schema/MainData/V1"
    exclude-result-prefixes="md1">

并修复你的xpath以匹配结构:

<xsl:value-of select="soap:Envelope/soap:Body/md1:insertDataResponse/md1:Response"/>

然而,鉴于您的输入和输出有多么相似,您可能最好采用不同的方式构建事物,而是将样式表基于身份转换(本网站上的其他问题中有数百个示例) )。