我对使用命名空间的xsl没有多少经验,我使用xsl来转换xml。
这是xml输入,
<GetAvailability>
<RequestSection>
<Hotel>
<StayDateRange Start="25/02/2012" End="27/02/2012"/>
<HotelSearchCriteria>
<HotelRef HotelCityName="MUMBAI" HotelCityCode="666" Currency="USD" Nationality="US"/>
<Rooms>
<Room Type="Single" ChildCount="1" AdultsCount="1" ExtraBed="0" RateBasis="-1">
<Ages>
<Age>5</Age>
</Ages>
</Room>
</Rooms>
</HotelSearchCriteria>
</Hotel>
</RequestSection>
</GetAvailability>
我期待输出为,
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:b2bHotelSOAP" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soap:Header/>
<soap:Body>
<urn:getAvailableHotel soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<destinationId xsi:type="xsd:string">666</destinationId>
<checkIn xsi:type="xsd:date">2011-09-01</checkIn>
<checkOut xsi:type="xsd:date">2011-09-03</checkOut>
<currency xsi:type="xsd:string">USD</currency>
<clientNationality xsi:type="xsd:string">US</clientNationality>
<onRequest xsi:type="xsd:boolean">True</onRequest>
<rooms xsi:type="urn:roomArray" soapenc:arrayType="urn:paxesArray">
<paxes>
<pax>
<paxType>Adult</paxType>
</pax>
</paxes>
</rooms>
</urn:getAvailableHotel>
</soap:Body>
</soap:Envelope>
编辑:这是我尝试过的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">
<xsl:template name="start" match="/">
<xsl:if test="//HotelSearchCriteria/HotelRef/@HotelCityName != ''">
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:b2bHotelSOAP" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soap:Header/>
<soap:Body>
<urn:getAvailableHotel soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<apiKey xsi:type="xsd:string">
<xsl:value-of select="//ApiKey"/>
</apiKey>
<destinationId xsi:type="xsd:string">
<xsl:value-of select="//HotelRef/@HotelCityCode"/>
</destinationId>
<checkIn xsi:type="xsd:date">
<xsl:value-of select="//StayDateRange/@Start"/>
</checkIn>
<checkOut xsi:type="xsd:date">
<xsl:value-of select="//StayDateRange/@End"/>
</checkOut>
<currency xsi:type="xsd:string">
<xsl:value-of select="//Currency"/>
</currency>
<clientNationality xsi:type="xsd:string">
<xsl:value-of select="//Nationality"/>
</clientNationality>
<onRequest xsi:type="xsd:boolean">
<xsl:value-of select="//HotelAdvanacedSearchCriteria/Available"/>
</onRequest>
<rooms xsi:type="urn:roomArray" soapenc:arrayType="urn:paxesArray">
<xsl:apply-templates select="//HotelSearchCriteria/Rooms/Room" mode="search"/>
</rooms>
<filters xsi:type="urn:filterArray" soapenc:arrayType="urn:filter"/>
</urn:getAvailableHotel>
</soap:Body>
</soap:Envelope>
</xsl:if>
</xsl:template>
<xsl:template match="Room">
<paxes>
<xsl:attribute name="xsi:type">urn:paxesArray</xsl:attribute>
</paxes>
</xsl:template>
</xsl:stylesheet>
请为我提供此查询的解决方案。
答案 0 :(得分:1)
您的实际问题似乎在Room
模板中......
<xsl:template match="Room">
<paxes>
<xsl:attribute name="xsi:type">urn:paxesArray</xsl:attribute>
</paxes>
</xsl:template>
...因为您的Xsl会抱怨它无法识别xsi
命名空间。
要解决此问题,您必须将命名空间添加到您打算使用它的所有模板中 - 或者将其添加到<xsl:stylesheet />
内的顶层。
<xsl:template match="Room" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<paxes>
<xsl:attribute name="xsi:type">urn:paxesArray</xsl:attribute>
</paxes>
</xsl:template>
或 - 如果您希望保留在start
模板中添加属性的方式
<xsl:template match="Room" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<paxes xsi:type="urn:paxesArray">
<xsl:apply-templates />
</paxes>
</xsl:template>
您必须将Room
内的rooms
模板更改为<apply-templates />
:
<rooms xsi:type="urn:roomArray" soapenc:arrayType="urn:paxesArray">
<xsl:apply-templates />
</rooms>