http://learnsmoking.blog.sohu.com/31545606.html
一、模板规则
模板规则是用来对当前节点和当前节点列表来实例化,规定了当前节点和当前节点列表的显示样式,每一个模板规则就是一个<xsl:template>元素,属性match制定了需要规定的节点,而模板的内容就是用来规定节点的HTML模板。在XSLT名称空间的元素都要加上xsl前缀,没有xsl前缀的,都被直接作为结果树输出。
二、匹配节点模式
(1)匹配根结点
<xsl:template match="/">,表示匹配根节点
(2)匹配元素节点
<xsl:template match="employee">,表示匹配employee元素节点
(3)使用通配符
<xsl:template match="*">,表示匹配任何元素
(4)使用@匹配属性
<xsl:template match="@mode">,表示匹配mode属性,注意:XSLT处理器遍历节点树状结构时,并不处理属性节点,如果要让处理器处理属性节点,必须显示地调用<xsl:apply-templates>元素,并使用select属性选择属性节点,例如:
<xsl:template match="monthly_pat">
<xsl:apply-templates select="@mode"/>
</xsl:template>
<xsl:template match="@">
<xsl:value-of select="."/>
</xsl:template>
note: from envykok
指定的XPath是一个点号,表示当前节点本身,由于当前节点是XML元素,因此也就输出元素的文本内容,相当于输出XmlElement的InnerText 属性值。
还可以将@与星号(*)一起使用,例如:<xsl:template match="@*">,表示匹配任意的属性节点。
(5)使用斜杠(/)匹配子节点
<xsl:template match="employees/employee">,表示匹配employees元素节点下的任意的employee子节点。
(6)使用双斜杠(//)匹配后代节点
如果希望对某一类元素节点进行处理,而不管该节点所处的位置,例如:
<xsl:template match="//name">,表示匹配根节点下任意的name元素节点。
<xsl:template match="employees//name">,表示employees元素节点下任意的name元素节点。
(7)使用或操作符(|)
可以选择匹配多个节点。例如:<xsl:template match="name|age">,表示匹配任意的name或age元素节点;<xsl:template match="employee/name|monthly_pay/@mode">,表示匹配employee元素节点下的任意的name子节点,或monthly_pay元素节点的mode属性。
(8)使用([])操作符
可以在[]中使用布尔表达式,用于在节点集中更精确的匹配某个点,例如:
<xsl:template match="employee[1]">,表示匹配第一个employee元素(注意,序列以1开头)
(9)使用node()匹配节点
node()表示匹配除了属性和根节点之外的其他任何节点,如:<xsl:template match="node()">
note: from envykok
<xsl:template match="@*|node()" >->表示除根节点以外所有节点和属性节点
(10)使用text()匹配文本节点
text()表示匹配任意的文本节点,如:<xsl:template match="text()">
此外还有匹配处理指令:<xsl:template match="processing-instruction()">
匹配注释:<xsl:template match="comment()">
匹配模式不光可以在<xsl:template>的match属性中使用,还可以在<xsl:apply-templates>、<xsl:value-of>、<xsl:for-each>、<xsl:copy-of>、<xsl:sort>、<xsl:variable>和<xsl:param>的select属性中使用。
三、<xsl:apply-templates>元素
用于告诉处理器处理当前节点的所有子结点,包括文本节点,与样式表中的模板进行匹配,如果找到了匹配的模板就输出模板。在匹配的模板中还可以再包含<xsl:apply-templates>元素。例如:
<xsl:template match="/">
<xsl:apply-templates>
<xsl:template>
<xsl:template match="employee">
<xsl:apply-templates match="name">
<xsl:template>
四、<xsl:value-of>元素
创建文本节点,有一个必须的属性select,用于选择需要创建文本节点的标签,例如,要输出<name>元素的内容,则:
<xsl:template match="employee">
<xsl:value-of match="name">
<xsl:template>
五、<xsl:for-each>元素
有一个必须的属性select,用于指定一个表达式,表达式的结果一定是节点集,而<xsl:for-each>用于依次获取每一个节点,被选择的节点作为当前节点,例如,在<employee>中依次选取:
<xsl:template match="employees" mode="table">
<body>
<table border="1">
<xsl:for-each select="employee">
<tr>
<td><xsl:value-of select="name"/> </td>
<td><xsl:value-of select="age"/> </td>
<td><xsl:value-of select="mothly_pay"/> </td>
</tr>
</xsl:for-each>
</table>
</body>
</xsl:template>
六、mode属性
如果需要对一个元素进行多个处理,可以多次使用多个<xsl:apply-templates>元素,如果需要对同一个元素的处理输出不同结果,可以使用mode属性。只要将<xsl:template>和<xsl:apply-templates>的mode属性设为一致,那么就可以匹配了,例如:
<xsl:template match="/">
<table border="1">
<xsl:apply-templates select="employees/employee" mode="table">
</table>
<xsl:apply-templates select="employees/employee" mode="list">
</xsl:template>
<xsl:template match="employee" mode="table">
...
</xsl:template>
<xsl:template match="employee" mode="list">
...
</xsl:template>
七、内置的模板规则
(1)应用于所有元素节点和根节点
<xsl:template match="*|/">
<xsl:apply-templates>
</xsl:template>
目的是确保了根元素及其后代元素,即使在没有明确匹配的情况下,也能够递归地处理。如果不想使用内置模板,只要显式定义某个元素的模板即可,这样就腐败了模板规则。注意:如果匹配模板中没有调用<xsl:apply-templates>,则默认模板对当前节点的子节点失效,子结点不与任何模板匹配。
(2)针对具有mode属性的<xsl:apply-templates>元素
<xsl:template match="*|/" mode="m">
<xsl:apply-templates mode="m">
</xsl:template>
这样的话,当我们没有定义匹配模板,处理器会自动调用本身,递归处理。
八、对空白的处理
<xsl:strip-space elements="name age monthly_pay">,表示删除这三个元素中仅为空白组成的节点;<xsl:strip-space elements="*">,表示删除所有元素仅由空白组成的节点;
<xsl:preserve-space element="name age">,表示保留name和age元素的空白,处理器默认保留,所以很少用。