xsl模板覆盖了xsl include

时间:2017-06-06 04:56:33

标签: html xml templates xslt xslt-1.0

我正在尝试使用xsl为xml开发html页面时创建一些可重用的模板。但是当我包含其他xsl时,主要的xsl模板被覆盖而不是添加到它。请建议。

这是我的xml,

<employee>
<address>
    <street>street1</street>
    <city>city1</city>
    <doornumber>1-23</doornumber>
    <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>

<data>
    <name>data1</name>
</data>
<data>
    <name>data2</name>
</data>
<data>
    <name>data3</name>
</data>
<data>
    <name>data4</name>
</data>
<data>
    <name>data5</name>
</data>
</employee>

这是我的主要xsl,

 <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:include href="test_include1.xsl" /> -->
<!-- <xsl:include href="test_include2.xsl" /> -->
</xsl:stylesheet>

这是我的test_include1.xsl,

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

<xsl:template match="employee">

<table><tr>
    <th>data names</th></tr>
<xsl:for-each select="data">
<tr>
    <td>
        <xsl:value-of select="name"/>
    </td>
</tr>

</xsl:for-each>
</table>
</xsl:template>

</xsl:stylesheet>

这是我的test_include2.xsl,

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

<xsl:template match="employee">

<table><tr>
                <th>Name</th>
                <th>College</th></tr>
<tr>
    <td>
        <xsl:value-of select="personalinfo/name"/>
    </td>
    <td>
        <xsl:value-of select="remarks/education/college"/>
    </td>
    </tr>
</table>
</xsl:template>
</xsl:stylesheet>

我正在尝试在不同的模板中模块化相同的xml数据,以便我可以在其他样式表中重用相同的模板。请建议我如何实现这一目标。谢谢。 这是预期的结果,

     <html><body>
   <table>
        <tr>
        <th>Name</th>
        <th>College</th>
        <th>City</th>
        </tr>
        <tr>
        <td>testname1</td>
        <td>college1</td>
        <td>city1</td>
        </tr>
    </table>
    <table>
        <tr><th>data names</th></tr>
        <tr><td>data1</td></tr>
        <tr><td>data2</td></tr>
        <tr><td>data3</td></tr>
        <tr><td>data4</td></tr>
        <tr><td>data5</td></tr>
     </table>
     <table>
        <tr>
        <th>Name</th>
        <th>College</th>
        </tr>
        <tr>
        <td>testname1</td>
        <td>college1</td>
        </tr>
    </table>
    </body></html>

2 个答案:

答案 0 :(得分:0)

首先,我没有在任何这些样式表中看到任何xsl:include声明,所以我不太清楚你在做什么。 [对不起 - 错过了浅灰色注释掉的代码 - 显示器上的对比度差。]

其次,使用XSLT 1.0时,如果有两个匹配同一节点的模板具有相同的优先级和优先级,则行为定义不明确。从技术上讲,这是一个错误,但允许处理器通过选择“样式表中最后一个”的规则来恢复 - 当涉及多个模块时,这个规则本身并没有特别明确。

第三,你说“主要的xsl模板被覆盖而不是添加到它”。这表明你对你希望它的表现有一些特别的期望,但我无法弄清楚这种期望是什么。你还没有给出任何预期的结果,所以我不知道你想要达到的目标。但总是如此,如果你有多个匹配节点的规则,你要么得到一个错误,要么只执行其中一个规则 - 它们永远不会以任何方式组合。

答案 1 :(得分:0)

这可以通过模式来实现。 另一种方法是给每个xsl:template匹配一个优先级号。您要执行的优先级最高。优先级是xsl:template的属性

<xsl:template match = "employee" priority = "4"> do the task </xsl:template>