Пространство имен XML с XSL не работает - PullRequest
1 голос
/ 18 февраля 2012

У меня нет большого опыта работы с 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>

EDIT : вот 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>

, пожалуйста, предложите мне решение для этого запроса.

1 Ответ

1 голос
/ 18 февраля 2012

Кажется, что ваша настоящая проблема в шаблоне 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>
...