使用XSLT

时间:2018-08-10 17:07:32

标签: xml xslt xslt-1.0 xslt-grouping

我陷入了一个使用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次列出每个房间,并记录每个唯一的人的信息?

0 个答案:

没有答案