Semantic MediaWiki template with subobject: Difference between revisions
Jump to navigation
Jump to search
Line 59: | Line 59: | ||
|{{{审判时间}}} | |{{{审判时间}}} | ||
}} | }} | ||
</syntaxhighlight> | |||
== 核心区别 == | == 核心区别 == |
Revision as of 11:02, 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)
```wiki ! 某字段 | 某字段:: ```
- **存值**:`某字段::…` 把参数当全局属性写到当前页面。
- **展示**:同一个 `{{{某字段}}}` 插槽也直接在表格里渲染。
- **结果**:多次调用就把多组属性值都累积到同一个页面上,查询时它们会两两配对(笛卡尔积)。
---
- 改进后模板(有 Subobject)
```wiki {{#subobject:Semantic MediaWiki template with subobject/{{{某字段}}}
|某字段= {{{某字段}}} |…其它字段…
}}
某字段 | {{{某字段}}} | …其余展示… |
---|
```
1. **分对象存值**
* `#subobject` 用“页面名/某字段”做唯一 ID,每次调用创建独立记录,将 `某字段`(以及其它字段)写入这个子对象。
2. **单独展示**
* 表格里只是把模板参数 `{{{某字段}}}`(或经 `#time` 格式化后的值)渲染出来,不再重复写入属性。
- **结果**:每条记录独立存储,查询时 `#ask` 不会再把不同记录里的属性混配,输出就能保持一一对应。
---
这样,你就同时解决了“笛卡尔积乱配”与“参数既要存值又要展示”的问题。