我陷入了一个使用XSLT 1.0查询数据库的项目,然后一口气将查询到的XML数据转换为HTML。这是我第一次接触XSLT。
我的目标是获取房间列表,并找出当前每个房间中的人。我必须使用两个不同的查询,一个要获取房间,另一个要获取当前在房间中的人员列表。第二个查询还从人员室联接表中提取数据。 XML如下显示:
<DATASETLIST>
<DATASET entity=”ROOM” >
<ROW>
<ROOM_ID>
<ROOM_Name>
<ROOM_Occupancy>
<ROOM_OccupantCount>
</ROW>
<DATASET entity= “BOOKING;PERSON”>
<ROW>
<BOOKING_ID>
<BOOKING_PERSON_ID>
<BOOKING_ROOM_ID>
<DATASET entity=”PERSON”>
<ROW>
…. PERSON INFO
</ROW>
</DATASET>
</ROW>
</DATASET>
</DATASETLIST>
每个房间号都有一个字母和数字。例如A1,A2,B1,B2等。其中一项要求是按字母将它们分组,这是我使用Muenchian分组完成的。
然后,我遍历每个组的房间列表。因此,我正在为每个房间及其相应的占用者创建一个HTML表。
BLOCK A
Room # Person Misc Person Info
A1 Smith, Joe blah, blah
我正在使用以下代码将该人与房间匹配:
<table>
<xsl:for-each select=”$blocks” > (variable holds the grouping results)
<tr>
<td>
<xsl:value-of select=”ROOM_ID” />
</td>
<xsl:for-each select=”//*[BOOKING__ROOM_ID = current()/ROOM__Id]” >
<td>
<xsl:value-of select="current()/DATASET/ROW/PERSON_Name" />
</td>
<td>
<xsl:value-of select="current()/DATASET/ROW/PERSON_Info" />
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
这可行,但是我遇到的问题是某些房间可以容纳一个以上的乘员。因此,表格数据将两个人放在一行上,并弄乱了表格的格式。 我尝试过递归调用模板,以为房间中的每个占用位置创建一行,但这也复制了人员。
所有这些都将运行并显示在供应商的程序中。 SQL查询是SQL-92的专有方言,因此必须以某种方式查询数据,并且XML结果是不可变的(据我所知)。使用XSLT,我如何列出每个房间;如果一个房间中有不止一个人,则该N次列出每个房间,并记录每个唯一的人的信息?