如何将sql查询转换为xslt?
我有一个xml文件如何将sql查询转换为xslt?,xslt,Xslt,我有一个xml文件 <ServiceHotel> <AvailableRoom> <HotelOccupancy> <RoomCount>1</RoomCount> <Occupancy> <AdultCount>1</AdultCount> <ChildCount>1</Chil
<ServiceHotel>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>1</AdultCount>
<ChildCount>1</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Room Only</Board>
<RoomType>Double/twin Superior</RoomType>
<Price>
<Amount>21.168</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>3</AdultCount>
<ChildCount>0</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Room Only</Board>
<RoomType>Twin Superior</RoomType>
<Price>
<Amount>34.195</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>1</AdultCount>
<ChildCount>1</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Room Only</Board>
<RoomType>Double/twin Superior</RoomType>
<Price>
<Amount>25.618</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>3</AdultCount>
<ChildCount>0</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Room Only</Board>
<RoomType>Double/twin Superior</RoomType>
<Price>
<Amount>38.645</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>1</AdultCount>
<ChildCount>0</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Room Only</Board>
<RoomType>Single Superior</RoomType>
<Price>
<Amount>25.618</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>1</AdultCount>
<ChildCount>0</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Room Only</Board>
<RoomType>Double Superior</RoomType>
<Price>
<Amount>19.840</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>3</AdultCount>
<ChildCount>0</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Bed and Breakfast</Board>
<RoomType>Twin Superior</RoomType>
<Price>
<Amount>34.195</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>3</AdultCount>
<ChildCount>0</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Bed and Breakfast</Board>
<RoomType>Double/twin Superior</RoomType>
<Price>
<Amount>38.645</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>1</AdultCount>
<ChildCount>0</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Bed and Breakfast</Board>
<RoomType>Single Superior</RoomType>
<Price>
<Amount>25.618</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>1</AdultCount>
<ChildCount>0</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Bed and Breakfast</Board>
<RoomType>Double Superior</RoomType>
<Price>
<Amount>19.840</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>3</AdultCount>
<ChildCount>0</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Full Board</Board>
<RoomType>Twin Superior</RoomType>
<Price>
<Amount>35.195</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>3</AdultCount>
<ChildCount>0</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Full Board</Board>
<RoomType>Double/twin Superior</RoomType>
<Price>
<Amount>32.645</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>3</AdultCount>
<ChildCount>0</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Half Board</Board>
<RoomType>Twin Superior</RoomType>
<Price>
<Amount>35.195</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>3</AdultCount>
<ChildCount>0</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Half Board</Board>
<RoomType>Double/twin Superior</RoomType>
<Price>
<Amount>32.645</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>1</AdultCount>
<ChildCount>0</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Half Board</Board>
<RoomType>Single Superior</RoomType>
<Price>
<Amount>28.618</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>1</AdultCount>
<ChildCount>0</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Half Board</Board>
<RoomType>Double Superior</RoomType>
<Price>
<Amount>20.840</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
<AvailableRoom>
<HotelOccupancy>
<RoomCount>1</RoomCount>
<Occupancy>
<AdultCount>1</AdultCount>
<ChildCount>1</ChildCount>
</Occupancy>
</HotelOccupancy>
<HotelRoom>
<Board>Half Board</Board>
<RoomType>Double/twin Superior</RoomType>
<Price>
<Amount>30.168</Amount>
</Price>
</HotelRoom>
</AvailableRoom>
</ServiceHotel>
我的sql查询的输出是
Grand_Total, Total_Adults, Board_Type, Room_Type, Room_Count, Adults, Child, Price
75.203 110 Room Only Double Superior 1 1 0 19.84
75.203 111 Room Only Double/twin Superior 1 1 1 21.168
75.203 130 Room Only Twin Superior 1 3 0 34.195
83.653 110 Half Board Double Superior 1 1 0 20.84
83.653 111 Half Board Double/twin Superior 1 1 1 30.168
83.653 130 Half Board Double/twin Superior 1 3 0 32.645
我需要创建XSL 1.0文件以获取此输出。(相当于SQL查询)
我尝试下面的查询,但工作不好
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:key name="by-board" match="AvailableRoom" use="HotelRoom/Board"/>
<xsl:key name="by-b" match="AvailableRoom" use="concat(HotelRoom/Board,'|',HotelOccupancy/Occupancy/AdultCount , '|',HotelOccupancy/Occupancy/ChildCount)"/>
<xsl:key name="TotalAdults" match="HotelOccupancy" use="concat(Occupancy/AdultCount, '|', Occupancy/ChildCount)" />
<xsl:variable name="TotalRoomCount" select="count(/ServiceHotel/AvailableRoom/HotelOccupancy [generate-id(.) = generate-id(key('TotalAdults', concat(Occupancy/AdultCount, '|', Occupancy/ChildCount))[1])])" />
<xsl:template match="/">
<table cellpadding="0" cellspacing="0" border="1">
<tr>
<td height="28" width="290"><font face="Arial" size="2">Room Type</font></td>
<td height="28" width="302"><font face="Arial" size="2">Board Type</font></td>
<td height="28" width="51" align="center"><font face="Arial" size="2">R.Count</font></td>
<td height="28" width="52" align="center"><font face="Arial" size="2">A.Count</font></td>
<td height="28" width="52" align="center"><font face="Arial" size="2">C.Count</font></td>
<td height="28" width="89" align="center"><font face="Arial" size="2">Price</font></td>
</tr>
<xsl:apply-templates select="ServiceHotel" />
</table>
</xsl:template>
<xsl:template match="ServiceHotel">
<xsl:for-each select="AvailableRoom[generate-id() = generate-id(key('by-board', HotelRoom/Board)[1])
and count(key('by-board', HotelRoom/Board)) >=
$TotalRoomCount
]">
<xsl:sort select="sum(key('by-board', HotelRoom/Board)[position() < 4]/HotelRoom/Price/Amount)"/>
<xsl:apply-templates select="." mode="group"/>
</xsl:for-each>
</xsl:template>
<xsl:template match="AvailableRoom" mode="group">
<xsl:apply-templates select="key('by-board', HotelRoom/Board)[generate-id() = generate-id(key('by-b',
concat(HotelRoom/Board,'|',HotelOccupancy/Occupancy/AdultCount , '|',HotelOccupancy/Occupancy/ChildCount)
)[1])
]">
<xsl:sort select="HotelRoom/Price/Amount" data-type="number"/>
</xsl:apply-templates>
<tr>
<td height="28" width="290" bgcolor="#FFFFCC"><font face="Arial" size="2"></font></td>
<td height="28" width="302" bgcolor="#FFFFCC"><font face="Arial" size="2"></font></td>
<td height="28" width="51" align="center" bgcolor="#FFFFCC"><font face="Arial" size="2"></font></td>
<td height="28" width="52" align="center" bgcolor="#FFFFCC"><font face="Arial" size="2"></font></td>
<td height="28" width="52" align="center" bgcolor="#FFFFCC"><font face="Arial" size="2"></font></td>
<td height="28" width="89" align="center" bgcolor="#FFFFCC"><font face="Arial" size="2"><xsl:value-of select="format-number(sum(key('by-board', HotelRoom/Board)[position() < 4] /HotelRoom/Price/Amount), '#.000')"/></font></td>
</tr>
</xsl:template>
<xsl:template match="AvailableRoom">
<tr>
<td height="28" width="290"><font face="Arial" size="2"><xsl:value-of select="HotelRoom/RoomType"/></font></td>
<td height="28" width="302"><font face="Arial" size="2"><xsl:value-of select="HotelRoom/Board"/></font></td>
<td height="28" width="51" align="center"><font face="Arial" size="2"><xsl:value-of select="HotelOccupancy/RoomCount"/></font></td>
<td height="28" width="52" align="center"><font face="Arial" size="2"><xsl:value-of select="HotelOccupancy/Occupancy/AdultCount"/></font></td>
<td height="28" width="52" align="center"><font face="Arial" size="2"><xsl:value-of select="HotelOccupancy/Occupancy/ChildCount"/></font></td>
<td height="28" width="89" align="center"><font face="Arial" size="2"><xsl:value-of select="format-number(HotelRoom/Price/Amount, '#.000')"/></font></td>
</tr>
</xsl:template>
</xsl:stylesheet>
房间类型
板型
R.计数
A.计数
C.计数
价格
我相信您的意思是希望XSLT输出与示例SQL当前输出的表相同的表
我可以通过使用节点集扩展函数来实现这一点。当您根据板卡类型“分组”时,结果存储在变量中,而不仅仅是输出房间组
<xsl:variable name="rooms">
<xsl:apply-templates
select="//AvailableRoom
[HotelRoom/Board = current()/HotelRoom/Board]
[generate-id() = generate-id(key('by-b', concat(HotelRoom/Board,'|',HotelOccupancy/Occupancy/AdultCount , '|',HotelOccupancy/Occupancy/ChildCount))[1])]" mode="room" />
</xsl:variable>
这样,您就可以排除电路板中的元素,例如,这些元素中的元素少于三个
<xsl:if test="count(ns:node-set($rooms)/AvailableRoom) >= 3">
这是完整的XSLT
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="ns">
<xsl:output method="html" indent="yes"/>
<xsl:key name="by-board" match="AvailableRoom" use="HotelRoom/Board" />
<xsl:key name="by-b" match="AvailableRoom" use="concat(HotelRoom/Board,'|',HotelOccupancy/Occupancy/AdultCount , '|',HotelOccupancy/Occupancy/ChildCount)"/>
<xsl:template match="/ServiceHotel">
<table border="1">
<tr>
<td>Grand Total</td>
<td>Total Adults?</td>
<td>Board Type</td>
<td>Room Type</td>
<td>Room Count</td>
<td>Adults</td>
<td>Child</td>
<td>Price</td>
</tr>
<xsl:apply-templates select="AvailableRoom[generate-id() = generate-id(key('by-board',HotelRoom/Board)[1])]" mode="board" />
</table>
</xsl:template>
<xsl:template match="AvailableRoom" mode="board">
<xsl:variable name="rooms">
<xsl:apply-templates
select="//AvailableRoom
[HotelRoom/Board = current()/HotelRoom/Board]
[generate-id() = generate-id(key('by-b', concat(HotelRoom/Board,'|',HotelOccupancy/Occupancy/AdultCount , '|',HotelOccupancy/Occupancy/ChildCount))[1])]" mode="room" />
</xsl:variable>
<xsl:if test="count(ns:node-set($rooms)/AvailableRoom) >= 3">
<xsl:apply-templates select="ns:node-set($rooms)/AvailableRoom">
<xsl:with-param name="total" select="sum(ns:node-set($rooms)/AvailableRoom/HotelRoom/Price/Amount)" />
<xsl:sort select="HotelRoom/Price/Amount" />
</xsl:apply-templates>
</xsl:if>
</xsl:template>
<xsl:template match="AvailableRoom" mode="room">
<xsl:for-each select="key('by-b', concat(HotelRoom/Board,'|',HotelOccupancy/Occupancy/AdultCount , '|',HotelOccupancy/Occupancy/ChildCount))">
<xsl:sort select="HotelRoom/Price/Amount" />
<xsl:if test="position() = 1">
<xsl:copy-of select="." />
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="AvailableRoom">
<xsl:param name="total" />
<tr>
<td>
<xsl:value-of select="format-number($total, '0.00')" />
</td>
<td>
<xsl:value-of select="HotelOccupancy/RoomCount"/>
<xsl:value-of select="HotelOccupancy/Occupancy/AdultCount"/>
<xsl:value-of select="HotelOccupancy/Occupancy/ChildCount"/>
</td>
<td>
<xsl:value-of select="HotelRoom/Board"/>
</td>
<td>
<xsl:value-of select="HotelRoom/RoomType"/>
</td>
<td>
<xsl:value-of select="HotelOccupancy/RoomCount"/>
</td>
<td>
<xsl:value-of select="HotelOccupancy/Occupancy/AdultCount"/>
</td>
<td>
<xsl:value-of select="HotelOccupancy/Occupancy/ChildCount"/>
</td>
<td>
<xsl:value-of select="HotelRoom/Price/Amount"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
总计
成年人总数?
板型
房间类型
房间数
成人
小孩
价格
当应用于示例XML时,将输出以下内容
<table border="1">
<tr>
<td>Grand Total</td>
<td>Total Adults?</td>
<td>Board Type</td>
<td>Room Type</td>
<td>Room Count</td>
<td>Adults</td>
<td>Child</td>
<td>Price</td>
</tr>
<tr>
<td>75.20</td>
<td>110</td>
<td>Room Only</td>
<td>Double Superior</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>19.840</td>
</tr>
<tr>
<td>75.20</td>
<td>111</td>
<td>Room Only</td>
<td>Double/twin Superior</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>21.168</td>
</tr>
<tr>
<td>75.20</td>
<td>130</td>
<td>Room Only</td>
<td>Twin Superior</td>
<td>1</td>
<td>3</td>
<td>0</td>
<td>34.195</td>
</tr>
<tr>
<td>83.65</td>
<td>110</td>
<td>Half Board</td>
<td>Double Superior</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>20.840</td>
</tr>
<tr>
<td>83.65</td>
<td>111</td>
<td>Half Board</td>
<td>Double/twin Superior</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>30.168</td>
</tr>
<tr>
<td>83.65</td>
<td>130</td>
<td>Half Board</td>
<td>Double/twin Superior</td>
<td>1</td>
<td>3</td>
<td>0</td>
<td>32.645</td>
</tr>
</table>
总计
成年人总数?
板型
房间类型
房间数
成人
小孩
价格
75.20
110
仅限房间
双优
1.
1.
0
19.840
75.20
111
仅限房间
双人/双人高级
1.
1.
1.
21.168
75.20
130
仅限房间
孪生上级
1.
3.
0
34.195
83.65
110
半板
双优
1.
1.
0
20.840
83.65
111
半板
双人/双人高级
1.
1.
1.
30.168
83.65
130
半板
双人/双人高级
1.
3.
0
32.645
请注意,扩展功能在很大程度上取决于您使用的处理器。在本例中,我使用的是Mircosoft,因此扩展函数的名称空间是urn:schemas microsoft com:xslt。如果您没有使用此功能,则需要找到支持的功能;XSLT很可能用于将一个xml文档转换为另一个xml文档。它不是“数据表示”格式,我不想再谈xsl了。但我认为我们可以在xsl中创建一个组过滤器?您希望输出的文件格式是什么?1)。按董事会+房间数+成人+儿童分组。2) 如果电路板不够,请避免输出该电路板。3) 以董事会最便宜的价格为例,您还没有解释转换必须实现的规则——不要指望XSLT专家熟悉SQL。请编辑问题并提供必要的解释(SQL代码可以省略,因为它很混乱,只占用空间)。
<table border="1">
<tr>
<td>Grand Total</td>
<td>Total Adults?</td>
<td>Board Type</td>
<td>Room Type</td>
<td>Room Count</td>
<td>Adults</td>
<td>Child</td>
<td>Price</td>
</tr>
<tr>
<td>75.20</td>
<td>110</td>
<td>Room Only</td>
<td>Double Superior</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>19.840</td>
</tr>
<tr>
<td>75.20</td>
<td>111</td>
<td>Room Only</td>
<td>Double/twin Superior</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>21.168</td>
</tr>
<tr>
<td>75.20</td>
<td>130</td>
<td>Room Only</td>
<td>Twin Superior</td>
<td>1</td>
<td>3</td>
<td>0</td>
<td>34.195</td>
</tr>
<tr>
<td>83.65</td>
<td>110</td>
<td>Half Board</td>
<td>Double Superior</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>20.840</td>
</tr>
<tr>
<td>83.65</td>
<td>111</td>
<td>Half Board</td>
<td>Double/twin Superior</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>30.168</td>
</tr>
<tr>
<td>83.65</td>
<td>130</td>
<td>Half Board</td>
<td>Double/twin Superior</td>
<td>1</td>
<td>3</td>
<td>0</td>
<td>32.645</td>
</tr>
</table>