每个元素的XSL

时间:2015-07-03 05:19:22

标签: xml xslt xpath

我正在尝试循环一个元素,需要在表格内打印数据 这是我的xml文件

      <hotels xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
    xsi:noNamespaceSchemaLocation='5.xsd'>
<hotel ID="1">
    <Name>Les Jardins du Marais</Name>
    <Stars>3</Stars>
    <Facilities>Internet</Facilities>
    <Address>74 reu Amelot, Paris, 75011</Address>
    <Distance>2</Distance>
    <Available>true</Available>
</hotel>
<hotel ID="2">
    <Name>Golden Tulip Little Palace</Name>
    <Stars>4</Stars>
    <Facilities>Internet</Facilities>
    <Facilities>Gym</Facilities>
    <Facilities>Parking</Facilities>
    <Facilities>Restaurant</Facilities>
    <Address>4 rue salomo,De caus, Paris, 75003</Address>
    <Distance>0.1</Distance>
    <Available>false</Available>
</hotel>
<hotel ID="3">
    <Name>Tilsitt Etoile</Name>
    <Stars>2</Stars>
    <Facilities>Restaurant</Facilities>
    <Address>23 rue brey, Paris, 75017</Address>
    <Distance>3</Distance>
    <Available>false</Available>
</hotel>
<hotel ID="4">
    <Name>Hotel saint charles</Name>
    <Stars>3</Stars>
    <Facilities>Parking</Facilities>
    <Address>6 rue de 1'Esperance, Paris, 75013</Address>
    <Distance>1</Distance>
    <Available>true</Available>
</hotel>

这是我的xsl文件

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
    <html>
        <body>
            <h2>Students</h2>
            <table border="1">
                <tr bgcolor="#9acd32">   
                    <th>ID</th>
                    <th>Name</th>
                    <th>Stars</th>
                    <th>Facilites</th>
                    <th>Address</th>
                    <th>Distance</th>
                    <th>Available</th>    
                </tr>
                <xsl:for-each select="hotels/*">
                    <tr>     
                        <td>
                            <xsl:value-of select="@ID"/>
                        </td>
                        <td>
                            <xsl:value-of select="Name"/>
                        </td>
                        <td>
                            <xsl:value-of select="Stars"/>
                        </td>
                        <td>
                            <xsl:value-of select="Facilities"/>
                        </td>
                        <td>
                            <xsl:value-of select="Address"/>
                        </td>
                        <td>
                            <xsl:value-of select="Distance"/>
                        </td>
                        <td>
                            <xsl:value-of select="Available"/>
                        </td>    
                    </tr>   
                </xsl:for-each> 
            </table>  
        </body>
    </html>
</xsl:template>

由于单个酒店有多个设施,我需要了解如何循环设施,任何帮助都会提前和感谢

1 个答案:

答案 0 :(得分:0)

虽然您可以添加第二个嵌套xsl:foreach,但通常最好通过将问题分解为较小的模板来维护Xsl,每个模板都关注特定问题。最好使用模板匹配,而不是必需的循环来处理你的xml,因为它允许过滤,递归和其他好处。通过这种方式,可以为每个Facility定义一个模板,然后您可以从酒店模板中应用它。您还需要确定如何在表格中显示设施列表 - 我在这里假设了一个嵌套表格:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>
    <xsl:template match="/">
        <html>
            <body>
                <h2>Students</h2>
                <table border="1">
                    <tr bgcolor="#9acd32">
                        <th>ID</th>
                        <th>Name</th>
                        <th>Stars</th>
                        <th>Facilites</th>
                        <th>Address</th>
                        <th>Distance</th>
                        <th>Available</th>
                    </tr>
                    <xsl:apply-templates select="hotels/hotel" />
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="hotel">
        <tr>
            <td>
                <xsl:value-of select="@ID"/>
            </td>
            <td>
                <xsl:value-of select="Name"/>
            </td>
            <td>
                <xsl:value-of select="Stars"/>
            </td>
            <td>
                <table>
                    <xsl:apply-templates select="Facilities" />
                </table>
            </td>
            <td>
                <xsl:value-of select="Address"/>
            </td>
            <td>
                <xsl:value-of select="Distance"/>
            </td>
            <td>
                <xsl:value-of select="Available"/>
            </td>
        </tr>
    </xsl:template>

    <xsl:template match="Facilities">
        <tr>
            <td>
                <xsl:value-of select="."/>
            </td>
        </tr>
    </xsl:template>

</xsl:stylesheet>

Xsl Transform fiddle