【问题标题】:Using SMW subobjects without having to duplicate the content无需复制内容即可使用 SMW 子对象
【发布时间】:2016-04-28 23:46:10
【问题描述】:

我想要实现的示例

我有许多补丁页面(“补丁 1.4”、“补丁 1.5”等)列出了对项目所做的更改,其中受影响/更改的内容链接到相应页面(“确认对话框”、 “foo”等):

补丁 1.4

  • 修复了 [[确认对话框]] 中的拼写问题

补丁 1.5

  • 添加了两个选项:[[foo]]、[[bar]]

在有关已更改内容的页面上(“确认对话框”、“foo”、...),我想自动显示所有相应的更改:

Foo

  • [[Patch 1.5]]:添加了两个选项:[[foo]]、[[bar]]

Semantic MediaWiki 的 子对象 可以做到这一点

#subobject 允许我为补丁页面上的每个更改创建一个(匿名)对象:

{{#subobject:|
|Changes=Added two options: [[foo]], [[bar]]
|Affects=Foo|Bar
}}

并且在每个页面上(“foo”等)我可以包含一个#ask subobject query 来列出所有匹配的子对象:

{{#ask: [[Affects::{{FULLPAGENAME}}]]
 |? Changes
}}

太棒了。

问题:我必须复制更改条目。

在补丁页面上,更改条目如下所示:

* Added two options: [[foo]], [[bar]] {{#subobject:|
|Changes=Added two options: [[foo]], [[bar]]
|Affects=Foo|Bar
}}

所以我必须两次指定“添加两个选项:[[foo]],[[bar]]”:一次用于可见内容,一次用于不可见子对象。

(语义)MediaWiki 中是否有办法做到这一点而无需复制内容?

理想的解决方案只需要我附上更改条目并在其旁边指定受影响的页面,例如:

* {{ Added two options: [[foo]], [[bar]] }}((foo|bar))

由于每个补丁页面可以列出数百个更改,我不想为每个更改创建单独的页面。

【问题讨论】:

    标签: mediawiki semantic-mediawiki


    【解决方案1】:

    如果我清楚地理解你的问题,看来你只需要一个简单的查询:

    {{#ask: [[-Has subobject::{{FULLPAGENAME}}]] 
    | ?Changes
    | format = ul
    | headers = hide
    | mainlabel = -
    }}
    

    由于使用 SMW 标记可能很乏味且容易出错,您也可以使用 MediaWiki 模板。您可以简化添加补丁更改:

    模板:更改

    <includeonly><!--
    -->{{#subobject:|
       | Changes = {{{1|}}}
       | Affects = {{{2|}}}|+sep=;
       }}<!--
    --></includeonly><nowiki/>
    

    {{{1}}}{{{2}}} 是位置参数,Affects 子对象属性使用 ; 分隔符(因为管道 | 不明确,可能会破坏模板、解析器函数等)。 &lt;nowiki/&gt; 是一种节省呼叫站点页面空白膨胀的技巧。

    您还可以添加一个特殊的模板来封装更改查询:

    模板:补丁更改

    <includeonly><!--
    -->{{#ask: [[-Has subobject::{{{1|{{FULLPAGENAME}}}}}]] 
       | ?Changes
       | format = ul
       | headers = hide
       | mainlabel = -
       }}<!--
    --></includeonly><nowiki/>
    

    默认情况下,模板要求当前页面的更改列表(如果位置参数 #1 参数为空),或者您可以稍后在调用站点显式覆盖它(例如,{{Patch changes|Patch 1.5}})。

    补丁 1.4

    {{Change | Fixed spelling in the [[confirmation dialog]] | Confirmation dialog}}
    
    {{Patch changes}}
    

    补丁 1.5

    {{Change | Added two options: [[foo]], [[bar]] | Foo; Bar}}
    
    {{Patch changes}}
    

    分别。

    这些链接以后可能有用:

    【讨论】:

    • 很好的解决方案,谢谢!我没有想到要在同一页面上查询子对象。我能看到的唯一警告:我丢失了原始补丁说明的单个结构(标题、嵌套列表等)。我猜标题可以通过添加另一个属性并为每个标题插入一个单独的查询来复制,但是在标记它时当然会做更多的工作。
    • 哦,我想我可以简单地在模板中再次添加{{{1|}}}(在#subobject 之外)!这种方式模板创建:可见的内容以及隐藏的子对象。而且我不必在补丁页面上查询子对象,因此可以保留结构(带有标题等)。
    • @unor 是的,我也在考虑这种方法,但我没有考虑针对特定情况进行更高级的结构化,而且我几乎总是尝试保留“数据”和“报告”模板设计分开,所以他们每个人都可以有自己的责任。当然,它使模板和数据结构更加复杂(真正的设计;另外 SMW 本身也是一个复杂的工具),但我认为您建议的解决方案非常适合您的情况。模板可以做得很好。 :)
    猜你喜欢
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多