我仍然试图让我的维基更多"动态"为了摆脱重复的数据。在我之前的question中,我问我如何绑定多个页面并通过绑定页面检索属性。由于这个问题已经解决了简单的情况(但我不太喜欢我的解决方案),我想让它适用于表格。让我们再考虑我在问题中提到的相同页面和属性结构,因此下面的代码
{{#ask: [[Category:Venues]] [[Self name::Heineken Music Hall]]}}
{{#ask: [[Category:Cities]] [[-Ref city.Self name::Heineken Music Hall]]}}
{{#ask: [[Category:Countries]] [[-Ref country.-Ref city.Self name::Heineken Music Hall]]}}
使用内联查询检索场地,城市(阿姆斯特丹)和国家(荷兰)。但是,我不确定表格是否可以使用这种方法。据我所知,#ask
可以生成一个表,该表生成直接属性的列:
{{#ask: [[Category:Live events]]
| ?Self date = Date
| ?Ref venue = Venue
| mainlabel = -
}}
输出:
+-----------------+---------------------+
| Date | Venue |
+-----------------+---------------------+
| 3 December 2012 | Heineken Music Hall |
+-----------------+---------------------+
我还想添加 City 和 Country 列。问题是,正如我上面提到的,城市和国家/地区属性没有直接放入 Venue 页面,因此#ask
函数可能使用内联子查询。但我无法使其发挥作用:
{{#ask: [[Category:Live events]]
| ?Self date = Date
| ?Ref venue = Venue
| ?WHAT_EXPRESSION_HERE? = City
| ?EVEN_MORE_COMPLEX_EXPRESSION_HERE? = Country
| mainlabel = -
}}
我首先想到的是使用format = template
和template = TEMPLATE_NAME
使用模板。我设法通过创建所需模板并解析{
...参数来使用这种方法提取绑定城市,但我似乎无法提取国家(提取简单:日期,地点;复杂:城市;不能:国家)。同样使用模板方法似乎很脆弱,对我来说也不是很一致。min
}
是否可以指定子查询/表达式而不是表的属性来从Semantic MediaWiki中提取间接绑定页面的属性(可能从不使用模板)?
答案 0 :(得分:0)
据我了解,这在Semantic MediaWiki中是不可能的,但它可以解决。简而言之,模板格式是必需的,这里是:
{{#ask: [[Category:Live events]]
| ?Self date = Date
| ?Ref venue = Venue
| mainlabel = -
| format = template
| template = Row:Live events table
| named args = yes
}}
Template:Row:Live events table
模板如下:
<includeonly><!--
-->{{#vardefine: DATE | {{{?Date}}}}}<!--
-->{{#vardefine: VENUE | {{{?Venue}}}}}<!--
-->{{#vardefine: CITY | {{SHOW_REF|{{#var: VENUE}}|?Ref city}}}}<!--
-->{{#vardefine: COUNTRY | {{SHOW_REF|{{#var: CITY}}|?Ref country}}}}<!--
-->{{#vardefine: CONTINENT | {{SHOW_REF|{{#var: COUNTRY}}|?Ref continent}}}}<!--
-->{{#var: DATE}}, {{#var: VENUE}}, {{#var: CITY}}, {{#var: COUNTRY}} {{#var: FLAG}}, {{#var: CONTINENT}}<br/><!--
--></includeonly>
在上面的模板中,我使用命名参数来提高容易度。但是,我使用#vardefine
和#var
来存储和检索当前行中的一些数据。这些函数由 Extension:Variables 扩展提供。我还使用了两个辅助模板:SHOW SELF
和SHOW REF
来简化数据提取。第一个模板SHOW SELF
只是一个捷径:
<includeonly>{{#show: {{FULLPAGENAME}} | {{{1|}}}}}</includeonly>
提取当前页面的属性。名为SHOW REF
的第二个模板简化了给定页面的数据提取,而不是当前页面的数据提取:
<includeonly>{{#show: {{PARSE_SMW_PAGE | {{{1|}}} }} | {{{2|}}}}}</includeonly>
是的,PARSE SMW PAGE
只是左右括号和可选的前导冒号:
<includeonly>{{#explode:
{{#sub: {#explode
} | {{#ifeq: {{#pos: {#pos
} | [:}} | 1 | 3 | 2 }} | -2 }}
| {{!}}
}}</includeonly>
#ifeq
和{{!}}
由 Extension:StringFunctions 提供,|
由 Extension:ParserFunctions 和{{1}提供}}是 let dater = NSDate()
let dayTimePeriodFormatter = NSDateFormatter()
dayTimePeriodFormatter.locale = NSLocale.currentLocale()
dayTimePeriodFormatter.timeZone = NSTimeZone(name: "UTC")
dayTimePeriodFormatter.dateFormat = "H:s"
var dateString = dayTimePeriodFormatter.stringFromDate(dater)
字符的虚拟模板。
如您所见,我设法抓取以下页面关系:
希望这也有助于其他人。