XSL无法正常工作的XML命名空间

时间:2012-02-18 08:51:59

标签: xml xslt xml-namespaces

我对使用命名空间的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>

请为我提供此查询的解决方案。

1 个答案:

答案 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>