不确定这是否是更好的方法,但看起来数组格式/数组及其#arraymap
函数#arrayunique
是修剪 SMW 子对象标签并进行 DISTINCT 操作的一种方法。不幸的是,下面的解决方案也描述了一个查询结果限制问题(至少在我对 SMW 的理解中)。一般来说,它可能如下所示,如果有人提出更好的解决方案,我将不胜感激:
<!-- Fetch all pages from the "Live event" namespace -->
{{#arraydefine: QUERY_RESULT
| {{#ask: [[Live event:+]]
| format = array
| link = none <!-- NOTE: array item link -->
| limit = 10000 <!-- NOTE: limit -->
}}
}}
<!-- Store the mapped result into another array -->
{{#arraydefine: MAPPED_QUERY_RESULT
| {{#arraymap: {{#arrayprint: QUERY_RESULT}}
| ,
| $O <!-- NOTE: array map iterator value -->
| {{#explode: $O <!-- NOTE: explode by hash -->
| #
| 0
}}
}}
| ,
| unique
}}
<!-- Generate links markup -->
{{#arraymap: {{#arrayprint: MAPPED_QUERY_RESULT}}
| ,
| $O
| [[$O]] <!-- NOTE: plain links -->
}}
上面代码的注释:
- 注意:数组项链接- 不抑制链接会导致映射器更加复杂(包括解析 HTML
<span>
标记和class
属性)。
- 注意:限制- 这可能是这里最大的问题,因为子对象的数量会影响查询结果。SMW默认限制查询结果,据我所知最大查询限制不能被覆盖。拥有更多行,其计数大于限制,将导致出现“进一步限制”链接。实际上,我不知道如何很好地解决它。
- 注意:数组映射迭代器值-
{{#arraymap}}
似乎以最简单的方式替换字符串,sed
或者简单的文本编辑器应用程序。So$O
用作formula
参数的迭代器值占位符,尽量不与其他字符串标记冲突。
- 注意:按散列分解-
#ask
子对象结果生成散列链接,如PageA#_159c1f213de2fcaf165f2c9c5c56686b
. 只是摆脱他们。如果您需要删除 wiki 链接,您还可以使用[[
or |
(分别编码为[<nowiki/>[
和<nowiki>|</nowiki>
)
- 注意:普通链接- 生成的链接将有下划线而不是空格。不幸的是,
[[{{#replace: $O | _ | <nowiki> </nowiki>}}]]
这对我不起作用——下划线只是由于某种原因被消耗掉了,但是在#replace
功能 wiki 页面上也推荐了这种方法。
一些链接: