将 xsl 应用于多个同名元素?

发布于 2025-01-07 23:38:59 字数 3794 浏览 0 评论 0原文

我在 xml 上应用 xsl 时遇到问题。该 xml 对于酒店、客房响应和每日价格具有相同的名称“项目”。我该如何解决这个问题?

这是 xml 请求,

<availableHotels enc:itemType="ns1:hotel" enc:arraySize="7" xsi:type="ns1:hotelArray">
    <item xsi:type="ns1:hotel">
        <processId xsi:type="xsd:string">HZ-51743575</processId>
        <hotelCode xsi:type="xsd:string">INHEYT</hotelCode>
        <availabilityStatus xsi:type="xsd:string">InstantConfirmation</availabilityStatus>
        <totalPrice xsi:type="xsd:float">275</totalPrice>
        <totalTax xsi:type="xsd:float">0</totalTax>
        <currency xsi:type="xsd:string">USD</currency>
        <boardType xsi:type="xsd:string">Room and Breakfast (Buffet)</boardType>
        <rooms enc:itemType="ns1:roomResponse" enc:arraySize="1" xsi:type="ns1:roomResponseArray">
            <item xsi:type="ns1:roomResponse">
                <roomCategory xsi:type="xsd:string">Standard Twin Room</roomCategory>
                <paxes enc:itemType="ns1:pax" enc:arraySize="2" xsi:type="ns1:paxesArray">
                    <item xsi:type="ns1:pax">
                        <paxType xsi:type="xsd:string">Adult</paxType>
                        <age xsi:type="xsd:integer">30</age>
                    </item>
                    <item xsi:type="ns1:pax">
                        <paxType xsi:type="xsd:string">Child</paxType>
                        <age xsi:type="xsd:integer">5</age>
                    </item>
                </paxes>
                <totalRoomRate xsi:type="xsd:float">275</totalRoomRate>
                <ratesPerNight enc:itemType="ns1:dailyRate" enc:arraySize="2" xsi:type="ns1:dailyRateArray">
                    <item xsi:type="ns1:dailyRate">
                        <date xsi:type="xsd:date">2012-02-25</date>
                        <amount xsi:type="xsd:float">138</amount>
                    </item>
                    <item xsi:type="ns1:dailyRate">
                        <date xsi:type="xsd:date">2012-02-26</date>
                        <amount xsi:type="xsd:float">137</amount>
                    </item>
                </ratesPerNight>
            </item>
        </rooms>
    </item>
</availableHotels>

我使用过 xsl,

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <Property>
            <xsl:apply-templates select="//availableHotels/item"/>1
        </Property>
    </xsl:template>
    <xsl:template match="item">
        <Rooms>
            <Room>
                <Rate>
                    <Nights>
                        <xsl:apply-templates select="ratesPerNight"/>
                    </Nights>
                </Rate>
            </Room>
        </Rooms>
    </xsl:template>
    <xsl:template match="ratesPerNight">
        <Night>
            ????????
        </Night>
    </xsl:template>
</xsl:stylesheet>

预期的 o/p:

<Property>
    <Rooms>
        <Room>
            <Rate>
                <Nights>
                    <Night Amount="6825.00" BookedDate="2012-02-25"/>
                                    <Night Amount="6825.00" BookedDate="2012-02-26"/>
                </Nights>
            </Rate>
        </Room>
    </Rooms>
</Property>

请帮我找出解决方案。

i am facing a problem while apply xsl on xml. the xml is having same name "item" for hotel, roomresponse and dailyrate. how do i resolve this issue?

here is the xml request,

<availableHotels enc:itemType="ns1:hotel" enc:arraySize="7" xsi:type="ns1:hotelArray">
    <item xsi:type="ns1:hotel">
        <processId xsi:type="xsd:string">HZ-51743575</processId>
        <hotelCode xsi:type="xsd:string">INHEYT</hotelCode>
        <availabilityStatus xsi:type="xsd:string">InstantConfirmation</availabilityStatus>
        <totalPrice xsi:type="xsd:float">275</totalPrice>
        <totalTax xsi:type="xsd:float">0</totalTax>
        <currency xsi:type="xsd:string">USD</currency>
        <boardType xsi:type="xsd:string">Room and Breakfast (Buffet)</boardType>
        <rooms enc:itemType="ns1:roomResponse" enc:arraySize="1" xsi:type="ns1:roomResponseArray">
            <item xsi:type="ns1:roomResponse">
                <roomCategory xsi:type="xsd:string">Standard Twin Room</roomCategory>
                <paxes enc:itemType="ns1:pax" enc:arraySize="2" xsi:type="ns1:paxesArray">
                    <item xsi:type="ns1:pax">
                        <paxType xsi:type="xsd:string">Adult</paxType>
                        <age xsi:type="xsd:integer">30</age>
                    </item>
                    <item xsi:type="ns1:pax">
                        <paxType xsi:type="xsd:string">Child</paxType>
                        <age xsi:type="xsd:integer">5</age>
                    </item>
                </paxes>
                <totalRoomRate xsi:type="xsd:float">275</totalRoomRate>
                <ratesPerNight enc:itemType="ns1:dailyRate" enc:arraySize="2" xsi:type="ns1:dailyRateArray">
                    <item xsi:type="ns1:dailyRate">
                        <date xsi:type="xsd:date">2012-02-25</date>
                        <amount xsi:type="xsd:float">138</amount>
                    </item>
                    <item xsi:type="ns1:dailyRate">
                        <date xsi:type="xsd:date">2012-02-26</date>
                        <amount xsi:type="xsd:float">137</amount>
                    </item>
                </ratesPerNight>
            </item>
        </rooms>
    </item>
</availableHotels>

xsl i have used,

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <Property>
            <xsl:apply-templates select="//availableHotels/item"/>1
        </Property>
    </xsl:template>
    <xsl:template match="item">
        <Rooms>
            <Room>
                <Rate>
                    <Nights>
                        <xsl:apply-templates select="ratesPerNight"/>
                    </Nights>
                </Rate>
            </Room>
        </Rooms>
    </xsl:template>
    <xsl:template match="ratesPerNight">
        <Night>
            ????????
        </Night>
    </xsl:template>
</xsl:stylesheet>

Expected o/p:

<Property>
    <Rooms>
        <Room>
            <Rate>
                <Nights>
                    <Night Amount="6825.00" BookedDate="2012-02-25"/>
                                    <Night Amount="6825.00" BookedDate="2012-02-26"/>
                </Nights>
            </Rate>
        </Room>
    </Rooms>
</Property>

please help me to find out the solution.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

踏月而来 2025-01-14 23:38:59

可以在模板上指定属性:

<xsl:template match="item[@xsi:type='ns1:dailyRate']">
</xsl:template>

这只会匹配那些项目...希望它有帮助

实际上,省略“xsi:”
这里有更多代码可以帮助您入门

    <xsl:output method="xml" encoding="utf-8" indent="no"/>
      <xsl:template match="/availableHotels">
        <Property>
            <xsl:apply-templates select="item/rooms"/>
        </Property>
    </xsl:template>

    <xsl:template match="rooms">
       <Room>
            <xsl:apply-templates select="item"/>
       </Room>
    <xsl:value-of select="@type"/>
    </xsl:template> 

    <xsl:template match="item[@type='ns1:roomResponse']">
     <xsl:value-of select="totalRoomRate"/>
     <xsl:value-of select="@type"/>
    </xsl:template>



    <xsl:template match="item">
     <xsl:value-of select="@type"/>
    </xsl:template>                                             

    <xsl:template match="*">
     <xsl:value-of select="name()"/>
    </xsl:template> 

最后一个模板对于捕获您错过的模板非常有用。

It is possible to specify attributes on templates:

<xsl:template match="item[@xsi:type='ns1:dailyRate']">
</xsl:template>

This will only match those items... hope it helps

Actually, leave out the 'xsi:'
Here is more code to get you started

    <xsl:output method="xml" encoding="utf-8" indent="no"/>
      <xsl:template match="/availableHotels">
        <Property>
            <xsl:apply-templates select="item/rooms"/>
        </Property>
    </xsl:template>

    <xsl:template match="rooms">
       <Room>
            <xsl:apply-templates select="item"/>
       </Room>
    <xsl:value-of select="@type"/>
    </xsl:template> 

    <xsl:template match="item[@type='ns1:roomResponse']">
     <xsl:value-of select="totalRoomRate"/>
     <xsl:value-of select="@type"/>
    </xsl:template>



    <xsl:template match="item">
     <xsl:value-of select="@type"/>
    </xsl:template>                                             

    <xsl:template match="*">
     <xsl:value-of select="name()"/>
    </xsl:template> 

The last template is very useful to capture the ones you have missed.

泪是无色的血 2025-01-14 23:38:59

您无法进入 ratesPerNight,因为它不是 item 的直接子项。在 XSL 中,将其与项目内的 进行匹配。
您需要的是将显式路径放置为 ,或者如果您想查找所有 ratesPerNight 元素而不修复您可以使用 的路径。

You can not go into ratesPerNight because it's not a direct child of item. In your XSL you match it with <xsl:apply-templates select="ratesPerNight"/> inside item.
What you need is to either put the explicit path there as <xsl:apply-templates select="rooms/item/ratesPerNight"/>, or if you want to find all ratesPerNight elements without fixing the path you can use <xsl:apply-templates select="descendant::ratesPerNight"/>.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文