Semantic MediaWiki template with subobject

在 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)

```wiki ! 某字段 | 某字段:: ```

  • **存值**:`某字段::…` 把参数当全局属性写到当前页面。
  • **展示**:同一个 `{{{某字段}}}` 插槽也直接在表格里渲染。
  • **结果**:多次调用就把多组属性值都累积到同一个页面上,查询时它们会两两配对(笛卡尔积)。

---

改进后模板(有 Subobject)

```wiki {{#subobject:Semantic MediaWiki template with subobject/{{{某字段}}}

|某字段= {{{某字段}}}
|…其它字段…

}}

某字段 {{{某字段}}} …其余展示…

```

1. **分对象存值**

  * `#subobject` 用“页面名/某字段”做唯一 ID,每次调用创建独立记录,将 `某字段`(以及其它字段)写入这个子对象。

2. **单独展示**

  * 表格里只是把模板参数 `{{{某字段}}}`(或经 `#time` 格式化后的值)渲染出来,不再重复写入属性。
  • **结果**:每条记录独立存储,查询时 `#ask` 不会再把不同记录里的属性混配,输出就能保持一一对应。

---

这样,你就同时解决了“笛卡尔积乱配”与“参数既要存值又要展示”的问题。