以下是一些有用的xslt通用技巧的简短列表,而这些技巧在w3schools上并未讲授。
- 属性值模板
W3C官方说明和示例
这是当您要将动态值放在元素的属性中时。 除了使用<xsl:attribute>元素,您还可以简单地将xpath放在属性本身中。
最常见的用法是创建超链接。
例:
源XML
旧的XSLT:<item> <link>www.google.ca</link> <desc>Search Engine</desc> </item> <item> <link>http://www.mytelus.com/ncp_news/</link> <desc>news</desc> </item>
新的XSLT:<xsl:template match="item"> <a> <xsl:attribute name="href"> <xsl:value-of select="link"/> </xsl:attribute> <xsl:value-of select="desc"/> </a> </xsl:template>
结果:<xsl:template match="item"> <a href="{link}"><xsl:value-of select="desc"/></a> </xsl:template>
现在不是更好了吗?<a href="www.google.ca">Search Engine</a> <a href="http://www.mytelus.com/ncp_news/">news</a>
- Muenchian分组
Jeni的XSLT页面:使用Muenchian方法进行分组
这是一种按特定值将元素分组在一起的方法。 由于许多字段是重复的,因此它在解释数据库转储生成的数据时特别有用。 这仅对于xslt 1.0才需要,因为2.0内置了分组功能。
例:
在这里,我们想按作者对书籍进行分组,因此我们有xslt代码,如下所示:<book> <title>How to Win Friends and Influence People</title> <author>Dale Carnegie</author> </book> <book> <title>Harry Potter and the Philosopher's Stone</title> <author>J.K. Rowling</author> </book> <book> <title>Harry Potter and the Deathly Hallows /title> <author>J.K. Rowling</author> </book>
输出:<xsl:key name="bookByAuthor" match="book" use="author"> <xsl:for-each select="//book[count(.|key('bookByAuthor', author)[1]) = 1]"> <author> <name><xsl:value-of select="author"/></name> <xsl:for-each select="key('bookByAuthor', author)"> <book><xsl:value-of select="title"/></book> </xsl:for-each> </author>
<author> <name>Dale Carnegie</name> <book>How to Win Friends and Influence People</book> </author> <author> <name>J.K. Rowling</name> <book>Harry Potter and the Philosopher's Stone</book> <book>Harry Potter and the Deathly Hallows</book> </author>
- 轴数
很多时候,您需要选择特定的节点,但是没有简单的方法来选择它们。 解? 使用轴! 最重要的如下:
1. following-sibling ::和previous-sibling ::
2.后代::(也写成.//)
3.祖先:
有关所有轴的列表,请参见链接。
XSLT 1.0:轴
这是一个人为的示例:
为了找到前一天的更改,我们执行以下操作:<stock symbol="SYM"> <price day="11022008" close="156"> <price day="12022008" close="135"> <price day="13022008" close="158"> <price day="14022008" close="158"> <price day="15022008" close="146"> </stock>
因此,如果我们要检查的日期不是第一天,则从这一天中减去先前价格的值,以查看更改。 请注意价格后使用[1]。 这告诉处理器我们只希望第一个价格节点在我们正在处理的价格节点之前。 轴上的节点具有基于轴的位置。<xsl:template match="stock"> <table> <tr> <th>day</th> <th>close</th> <th>change</th> </tr> <xsl:apply-templates/> </table> </xsl:template> <xsl:template match="price"> <tr> <td><xsl:value-of select="@day"></td> <td><xsl:value-of select="@close"></td> <td> <xsl:choose> <xsl:when test="position() = 1">-</xsl:when> <xsl:otherwise> <xsl:value-of select="@close - preceding-sibling::price[1]/@close"/> </xsl:otherwise> </xsl:choose> </td> </tr>
结果:<table> <tr><th>day</th><th>close</th><th>change</th></tr> <tr><td>11022008</td><td>156</td><td>-</td></tr> <tr><td>12022008</td><td>135</td><td>-21</td></tr> <tr><td>13022008</td><td>158</td><td>23</td></tr> <tr><td>14022008</td><td>158</td><td>0</td></tr> <tr><td>15022008</td><td>146</td><td>-12</td></tr> </table>
- 命名空间
很多时候,有人抱怨由于元素开头的名称空间前缀而导致某人无法选择元素。
要访问Vancouver下的24,xpath可能类似于:<atta:root xmlns:atta="www.atta.com"> <atta:table> <atta:row> <atta:city>Vancouver</atta:city> <atta:hnde>24</atta:hnde> </atta:row> <atta:row> <atta:city>Montreal</atta:city> <atta:hnde>36</atta:hnde> </atta:row> </atta:table> </atta>
“ / atta:root / atta:table / atta:row [atta:city ='Vancouver'] / atta:hnde”
- 值得一提的是:节点集功能。
由于这并不是严格意义上的xslt,而是依赖于扩展功能,因此我没有包含它。 它将xsl变量视为节点集(在XSLT 2.0中是自动的)。 例如。 exsl:node-set()xmlns:exslt =“ http://exslt.org/common”或
msxsl:node-set()xmlns:msxsl =“ urn:schemas-microsoft-com:xslt”
EXSLT-exsl:node-set
支持msxsl:node-set()函数
一般参考清单:
- XSLT教程
- XSLT参考
XSLT 1.0的良好参考。 特别是轴。 - XSLT参考
XSL元素
XPath,XQuery和XSLT函数参考
XPath 2.0功能。
如果您有任何其他提示应在此处添加,请随时回复。
From: https://bytes.com/topic/xml/insights/768835-xslt-tips-you-dont-learn-w3schools