1

我需要一个内联查询,它列出来自特定命名空间的所有页面,但不列出这些页面上指定的子对象。

将结果限制为命名空间是可能的:

{{#ask: [[ExampleNamespace:+]] }}

但它也列出了所有子对象。

解决方法:

  • 在这些页面上指定一个类别(子对象不继承它)并查询该类别:

    {{#ask: [[ExampleCategory]] }}
    
  • 在这些页面上指定一个属性(而不是在子对象上)并查询该属性(使用通配符值):

    {{#ask: [[ExampleProperty::+]] }}
    

但是这两种解决方法都需要编辑,我想避免。有没有更好的方法来解决这个问题?

4

1 回答 1

1

不确定这是否是更好的方法,但看起来数组格式/数组及其#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 页面上也推荐了这种方法。

一些链接:

于 2016-05-05T09:48:26.423 回答