我正在尝试使用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>
答案 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>