匹配多个节点的XSLT模板正在重复html

时间:2017-05-31 07:13:06

标签: html xml templates xslt-1.0

我在使用xsl在html表中显示xml时遇到问题。 1. html视图重复下面的xsl和 2.无法区分具有相同名称的子元素(例如:以下xml中的名称标签)。 xml在不同节点中具有不同类型的信息,如下所示。

<employee>
    <address>
        <street>street1</street>
        <city>city1</city>
        <pincode>123456</pincode>
    </address>
    <personalinfo>
        <name>testname1</name>
        <phone>999999999</phone>
        <dob>23-09-34</dob>
    </personalinfo>
    <remarks>
        <education>
            <name>testname2</name>
            <college>college1</college>
            <gpa>7.5</gpa>
        </education>
    </remarks>
</employee>

这是我的xsl

<?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"/>
  <xsl:template match="employee">
    <html>
    <body>
 <xsl:apply-templates/>
    </body>
    </html>
  </xsl:template>

  <xsl:template match="address|personalinfo|remarks">
    <table width="630">
      <tr>
        <td>Name</td>
        <td>College</td>
        <td>City</td>
      </tr>
      <tr>
        <td><xsl:value-of select="//name"/></td>
        <td><xsl:value-of select="//college"/></td>
       <td><xsl:value-of select="//city"/></td>
    </tr>
    </table>
    <span><br/>
    </span>
  </xsl:template>
</xsl:stylesheet>

请在这方面帮助我。谢谢。

2 个答案:

答案 0 :(得分:0)

从表结构来看,您希望将表头移动到与根节点匹配的模板,然后使用 relative (和显式)路径获取每个员工的相应详细信息:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:template match="/">
    <html>
        <body>    
            <table>
                <tr>
                    <th>Name</th>
                    <th>College</th>
                    <th>City</th>
                </tr>
                <xsl:apply-templates/>
            </table>
        </body>
    </html>
</xsl:template>

<xsl:template match="employee">
    <tr>
        <td>
            <xsl:value-of select="personalinfo/name"/>
        </td>
        <td>
            <xsl:value-of select="remarks/education/college"/>
        </td>
        <td>
            <xsl:value-of select="address/city"/>
        </td>
    </tr>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

表达式//name选择文档中任何位置的所有名称元素。这不是你想要的:你想要当前处理的personalInforemarks中的name元素:对于直接孩子来说是select="name",对于后代来说是select=".//name"任何深度。

使用相同的模板规则处理具有非常不同结构的三个元素(address|personalinfo|remarks)似乎很奇怪。