模板可以让我们从RDF中自动生成需要的元素。当我们需要做特殊处理时,我们可以通过rule来进行不同的处理。那么前面我们学习了一些rule元素的使用,但那些其实都只是简写。完整的rule元素有三个子元素:conditions, bindings, action。

mozilla在处理的时候,模板生成器会先根据conditions中的条件对资源进行匹配,如果匹配成功,则调用相应的action中的内容进行复制处理。

条件

conditions元素是rule中用来进行匹配使用的条件,它有三个子元素:content, member, triple。

  • content
    只能写一次。它用来将包含模板的元素中的rel所指的起始根对应到一个变量中。如:

    <content uri=”?var”/>

    uri的属性值将对应rel中的根资源。?表示后面的标识符是一个变量。var是变量名,可以随便写。

  • member
    用来映射每条资源的变量。

    <tree id=”citiesTree” datasources=”weather.rdf”
        ref=”http://www.xulplanet.com/rdf/weather/cities”> 
        <template>
            <rule>
                <conditions>
                    <content uri=”?list”/>
                    <member container=”?list” child=”?city”/>
                </conditions>
            </rule>
        </template>
    </tree>

    从本例可以看出list对应http://www.xulplanet.com/rdf/weather/cities。这样container对应list变量,child对应的值放在city变量中。那么content与member给我的感觉就是用来定义变量。content用来定义根变量,child用来定义每条资源。

  • triple
    它是一个三元组,用来定义匹配规则。一个triple由三要素组成:主题(subject), 谓词(predicate), object(目标),这一点我们在讲RDF时讲过。不过这里使用triple是用来检查一条资源是否之定义的规则相匹配。

    <conditions>
        <content uri=”?list”/>
        <member container=”?list” child=”?city”/>
        <triple subject=”?city”
            predicate=”http://www.xulplanet.com/rdf/weather#prediction”
            object=”Cloud”/>
    </conditions>

  • 这里定义了一个triple,它用来检查一条资源的天气是否与目标相一致。主题就是city变量对应的资源,谓词就是http://www.xulplanet.com/rdf/weather#prediction,目标在这里就是”Cloud”。当目标是一个值时,那么做判断处理。但是当它设为一个变量时,如”?pred”,那么处理时就是将对应的值放在pred变量中,同时判断它是否不为空。条件中可以放置多个triple。

那么conditions元素的作用一方面是进行条件的匹配,一方面是将相应的值放在变量中。不过现在还不清楚是否有更复杂的条件判断功能。

内容创建

在匹配成功后,生成器会自动调用action子元素中的内容进行处理。在action中你可以使用conditions中定义的变量。在rule的简单语法中,你使用uri=”rdf:*”来指明内容应该从哪里生成。在全语法中,你应该设置uri为conditions中的变量。通常使用member元素中的child属性所对应的变量。下面是一个完整的例子:

<tree id=”weatherTree” flex=”1″ datasources=”weather.rdf”
    ref=”http://www.xulplanet.com/rdf/weather/cities”>
    <treecols>
        <treecol id=”city” label=”City” primary=”true” flex=”1″/>
        <treecol id=”pred” label=”Prediction” flex=”1″/>
    </treecols>

<template>
    <rule>
        <conditions>
            <content uri=”?list”/>
            <member container=”?list” child=”?city”/>
            <triple subject=”?city”
                predicate=”http://www.xulplanet.com/rdf/weather#name”
                object=”?name”/>
            <triple subject=”?city”
                predicate=”http://www.xulplanet.com/rdf/weather#prediction”
                object=”?pred”/>
        </conditions>
        <action>
            <treechildren>
                <treeitem uri=”?city”>
                    <treerow>
                        <treecell label=”?name”/>
                        <treecell label=”?pred”/>
                    </treerow>
                </treeitem>
           </treechildren>
        </action>
    </rule>
</template>
</tree>

从例子我们可以看出,action元素中,uri=”?city”,而city是在member中的child属性对应的变量。treecell对应的值分别为”?name”和”?pred”。这个例子所对应的wheather.rdf文件在原教程中有,大家可以把它保存到自已的测试目录下,运行看一看。运行结果为:

从例子我们注意到这里没有设置flags=”dont-build-content “,因此这例子的内容不是直接从RDF文件中得到的。如果我们设置flags=”dont-build-content “,那么需要把上面的content元素改为treeitem。大家可以自行测试。

增加额外的绑定

bindings元素中可以定义多个binding元素,那么它的语法与triple很相似,主要的作用就是将信息与变量关联,如:

<bindings>
    <binding subject=”?city”
        predicate=”http://www.xulplanet.com/rdf/weather#temperature”
        object=”?temp”/>
</bindings>

那么它与triple不同之处就是不作判断处理。当指定的谓词不满足时,变量值为空。


评论

该日志第一篇评论

发表评论

评论也有版权!