Semantic MediaWiki template with subobject: Difference between revisions
Jump to navigation
Jump to search
Created page with "在 Semantic MediaWiki 使用过程中,难免需要在同一页面,使用相同的模板。相同模板使用多次时,会导致一个参数有多个取值,最终在用 #ask 查询时,出现笛卡尔积。笛卡尔积的定义:假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。笛卡尔积的排序是乱的,我们必须用 subobject,令每一个参数及其取值,都变得唯一..." |
|||
(13 intermediate revisions by the same user not shown) | |||
Line 10: | Line 10: | ||
== 自动模板 == | == 自动模板 == | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mediawiki" line> | ||
<noinclude> | <noinclude> | ||
{{#template_params: | {{#template_params: | ||
案件名称 (property=案件名称)| | 案件名称 (property=案件名称)| | ||
阶段案号 (property=阶段案号)| | 阶段案号 (property=阶段案号)| | ||
审判时间 (property=审判时间 | 审判时间 (property=审判时间)}} | ||
</noinclude> | </noinclude> | ||
Line 33: | Line 32: | ||
== subobject 模板 == | == subobject 模板 == | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mediawiki" line> | ||
<noinclude> | <noinclude> | ||
{{#template_params: | {{#template_params: | ||
Line 60: | Line 59: | ||
|{{{审判时间}}} | |{{{审判时间}}} | ||
}} | }} | ||
</syntaxhighlight> | |||
== 核心区别 == | == 核心区别 == | ||
=== 自动模板 === | |||
<pre> | |||
! 某字段 | ! 某字段 | ||
| [[某字段::{{{某字段|}}}]] | | [[某字段::{{{某字段|}}}]] | ||
</pre> | |||
* | * 存值:<nowiki>[[某字段::…]]</nowiki> 把参数当全局属性写到当前页面。 | ||
* | * 展示:同一个 `{{{某字段}}}` 插槽也直接在表格里渲染。 | ||
* | * 结果:多次调用就把多组属性值都累积到同一个页面上,查询时它们会两两配对(笛卡尔积)。 | ||
=== subobject 模板 === | |||
<pre> | |||
{{#subobject:{{PAGENAME}}/{{{某字段}}} | {{#subobject:{{PAGENAME}}/{{{某字段}}} | ||
|某字段= {{{某字段}}} | |某字段= {{{某字段}}} | ||
Line 92: | Line 84: | ||
|…其余展示… | |…其余展示… | ||
|} | |} | ||
</pre> | |||
* ** | * 分对象存值:`#subobject` 用“页面名/某字段”做唯一 ID,每次调用创建独立记录,将 `某字段`(以及其它字段)写入这个子对象。 | ||
* 单独展示:表格里只是把模板参数 `{{{某字段}}}`(或经 `#time` 格式化后的值)渲染出来,不再重复写入属性。 | |||
* 结果:每条记录独立存储,查询时 `#ask` 不会再把不同记录里的属性混配,输出就能保持一一对应。 | |||
== 符号 == | |||
== 总结 == | |||
这样,通过 subobject,就解决了一个页面复用模板时,同一参数多个值导致排序混乱的问题。 |
Latest revision as of 17:29, 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:{{PAGENAME}}/{{{某字段}}} |某字段= {{{某字段}}} |…其它字段… }} {| …表格开始… ! 某字段 | {{{某字段}}} |…其余展示… |}
- 分对象存值:`#subobject` 用“页面名/某字段”做唯一 ID,每次调用创建独立记录,将 `某字段`(以及其它字段)写入这个子对象。
- 单独展示:表格里只是把模板参数 `{{{某字段}}}`(或经 `#time` 格式化后的值)渲染出来,不再重复写入属性。
- 结果:每条记录独立存储,查询时 `#ask` 不会再把不同记录里的属性混配,输出就能保持一一对应。
符号
总结
这样,通过 subobject,就解决了一个页面复用模板时,同一参数多个值导致排序混乱的问题。