[英]xsl template is overriding with xsl include
我正在嘗試使用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>
首先,在任何這些樣式表中我都看不到任何xsl:include聲明,所以我不太確定您在做什么。 [抱歉-錯過了淺灰色的注釋代碼-我的顯示器對比度很差。]
其次,在XSLT 1.0中,當兩個模板與具有相同優先級和優先級的相同節點匹配時,行為不是很清楚。 從技術上講這是一個錯誤,但是可以通過選擇“樣式表中的最后一個”規則來允許處理器進行恢復-當涉及多個模塊時,規則本身並不是特別好定義。
第三,您說“主要的xsl模板將被覆蓋,而不是將其添加到其中”。 這表明您對希望它的行為有一些特殊的期望,但是我無法真正弄清楚這種期望是什么。 您沒有給出任何預期的結果,所以我不知道您要達到的目標。 但是,如果您有多個與節點匹配的規則,或者您遇到錯誤,或者恰好執行了其中一個規則,那么情況永遠都是這樣-絕不會以任何方式將它們組合在一起。
這可以通過模式來實現。 另一種方法是給每個xsl:template匹配一個優先級號。 您要執行的優先級最高。 優先級是xsl:template的屬性
<xsl:template match = "employee" priority = "4"> do the task </xsl:template>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.