如何使用XSLT将soap响应转换为xml?

时间:2014-12-29 07:48:28

标签: xml xslt soap

我正在尝试使用xslt将soap响应转换为xml,但我只获得空输出。 请任何人帮助我。

我的肥皂反应是

<Envelope 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<Body 
xmlns="http://schemas.xmlsoap.org/soap/envelope">
<OTA_HotelAvailRS TransactionIdentifier="12345" EchoToken="12345" Target="Test" TimeStamp="2008-03-18T10:46:53.393" Version="6.001">
<HotelImages>
<ImagePath>http://reznextlive.blob.core.windows.net/custcode-106/63710.jpg</ImagePath>
<ImagePath>http://reznextlive.blob.core.windows.net/custcode-106/63711.jpg</ImagePath>
<ImagePath>http://reznextlive.blob.core.windows.net/custcode-106/63712.jpg</ImagePath>
</HotelImages>
</OTA_HotelAvailRS>
</Body>
</Envelope>

我的XSLT IS

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes" />
<xsl:template match="/">
<images>
<xsl:value-of select="Envelope/Body/OTA_HotelAvailRS/HotelImages/ImagePath"/>
</images>
</xsl:template>
</xsl:stylesheet>

我的输出就像

<?xml version="1.0" encoding="utf-8"?>
<images xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>

2 个答案:

答案 0 :(得分:2)

希望这有帮助,

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:env="http://schemas.xmlsoap.org/soap/envelope"
                exclude-result-prefixes="xsl xsi env xsd">
  <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes" />
  <xsl:template match="/">
    <root>
    <xsl:for-each select="Envelope/env:Body/env:OTA_HotelAvailRS/env:HotelImages/env:ImagePath">
      <images>
        <xsl:value-of select="current()"/>
      </images>
    </xsl:for-each>
    </root>
  </xsl:template>
</xsl:stylesheet>

您必须在xslt中指定节点在源xml中所属的命名空间,以便在xslt中访问该节点

答案 1 :(得分:2)

您的样式表很接近,但在<Body>标记处有一个xmlns默认名称空间声明,适用于该节点和所有子项。看起来您可能已经尝试过,因为在样式表中声明了soap前缀。不幸的是,样式表中的soap命名空间不正确;应该没有尾随/。命名空间在词法上进行比较而非语义,因此两者不相等。

以下是一个示例:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope">
<xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes" />
<xsl:template match="/">
<images>
  <xsl:for-each select="Envelope/soap:Body/soap:OTA_HotelAvailRS/soap:HotelImages/soap:ImagePath">
    <xsl:value-of select="." />,
  </xsl:for-each>
</images>
</xsl:template>
</xsl:stylesheet>

您在样式表中获得的输出将仅是第一张图片。我在此处添加了xsl:for-each作为示例。