将 xsl 应用于多个同名元素?
我在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
可以在模板上指定属性:
这只会匹配那些项目...希望它有帮助
实际上,省略“xsi:”
这里有更多代码可以帮助您入门
最后一个模板对于捕获您错过的模板非常有用。
It is possible to specify attributes on templates:
This will only match those items... hope it helps
Actually, leave out the 'xsi:'
Here is more code to get you started
The last template is very useful to capture the ones you have missed.
您无法进入 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"/>
.