XSLT 学习二

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元素的空白,处理器默认保留,所以很少用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值