Semantic MediaWiki template with subobject: Difference between revisions
Jump to navigation
Jump to search
Line 68: | Line 68: | ||
</pre> | </pre> | ||
* 存值: | * 存值:<nowiki>[[某字段::…]]</nowiki> 把参数当全局属性写到当前页面。 | ||
* 展示:同一个 `{{{某字段}}}` 插槽也直接在表格里渲染。 | * 展示:同一个 `{{{某字段}}}` 插槽也直接在表格里渲染。 | ||
* 结果:多次调用就把多组属性值都累积到同一个页面上,查询时它们会两两配对(笛卡尔积)。 | * 结果:多次调用就把多组属性值都累积到同一个页面上,查询时它们会两两配对(笛卡尔积)。 |
Revision as of 11:06, 22 May 2025
在 Semantic MediaWiki 使用过程中,难免需要在同一页面,使用相同的模板。相同模板使用多次时,会导致一个参数有多个取值,最终在用 #ask 查询时,出现笛卡尔积。笛卡尔积的定义:假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。笛卡尔积的排序是乱的,我们必须用 subobject,令每一个参数及其取值,都变得唯一。subobject 的用法如下:
{{#subobject:mysubobject |Has property 1=value1 |Has property 1=value2 |Has property 2=value1 ... }}
自动模板
<noinclude>
{{#template_params:
案件名称 (property=案件名称)|
阶段案号 (property=阶段案号)|
审判时间 (property=审判时间)}}
</noinclude>
<includeonly>
{| class="wikitable"
! 案件名称
| [[案件名称::{{{案件名称|}}}]]
|-
! 阶段案号
| [[阶段案号::{{{阶段案号|}}}]]
|-
! 审判时间
| [[审判时间::{{#time:Y-m-d|{{{审判时间|}}}}}]]
subobject 模板
<noinclude>
{{#template_params:
案件名称 (property=案件名称)|
阶段案号 (property=阶段案号)|
审判时间 (property=审判时间)}}
</noinclude>
<includeonly>
<!-- 先把这一组数据存成一个子对象,子对象名用“页面名/阶段案号”确保唯一 -->
{{#subobject:{{PAGENAME}}/{{{阶段案号}}}
|案件名称= {{{案件名称}}}
|阶段案号= {{{阶段案号}}}
|审判时间= {{#time:Y-m-d|{{{审判时间}}}}}
}}
<!-- 然后再渲染成表格 -->
{| class="wikitable"
! 案件名称
| {{{案件名称}}}
|-
! 阶段案号
| {{{阶段案号}}}
|-
! 审判时间
|{{{审判时间}}}
}}
核心区别
原始模板(无 Subobject)
! 某字段 | [[某字段::{{{某字段|}}}]]
- 存值:[[某字段::…]] 把参数当全局属性写到当前页面。
- 展示:同一个 `{{{某字段}}}` 插槽也直接在表格里渲染。
- 结果:多次调用就把多组属性值都累积到同一个页面上,查询时它们会两两配对(笛卡尔积)。
改进后模板(有 Subobject)
{{#subobject:{{PAGENAME}}/{{{某字段}}} |某字段= {{{某字段}}} |…其它字段… }} {| …表格开始… ! 某字段 | {{{某字段}}} |…其余展示… |}
- 分对象存值:`#subobject` 用“页面名/某字段”做唯一 ID,每次调用创建独立记录,将 `某字段`(以及其它字段)写入这个子对象。
- 单独展示:表格里只是把模板参数 `{{{某字段}}}`(或经 `#time` 格式化后的值)渲染出来,不再重复写入属性。
- 结果:每条记录独立存储,查询时 `#ask` 不会再把不同记录里的属性混配,输出就能保持一一对应。