Semantic MediaWiki template with subobject: Difference between revisions

From 清冽之泉
Jump to navigation Jump to search
 
(6 intermediate revisions by the same user not shown)
Line 10: Line 10:


== 自动模板 ==
== 自动模板 ==
<syntaxhighlight lang="bash" line>
<syntaxhighlight lang="mediawiki" line>
<noinclude>
<noinclude>
{{#template_params:
{{#template_params:
Line 32: Line 32:


== subobject 模板 ==
== subobject 模板 ==
<syntaxhighlight lang="bash" line>
<syntaxhighlight lang="mediawiki" line>
<noinclude>
<noinclude>
{{#template_params:
{{#template_params:
Line 62: Line 62:


== 核心区别 ==
== 核心区别 ==
=== 自动模板(无 Subobject) ===
=== 自动模板 ===
<pre>
<pre>
! 某字段
! 某字段
Line 72: Line 72:
* 结果:多次调用就把多组属性值都累积到同一个页面上,查询时它们会两两配对(笛卡尔积)。
* 结果:多次调用就把多组属性值都累积到同一个页面上,查询时它们会两两配对(笛卡尔积)。


=== subobject 模板(有 Subobject) ===
=== subobject 模板 ===
<pre>
<pre>
{{#subobject:{{PAGENAME}}/{{{某字段}}}
{{#subobject:{{PAGENAME}}/{{{某字段}}}
Line 89: Line 89:
* 单独展示:表格里只是把模板参数 `{{{某字段}}}`(或经 `#time` 格式化后的值)渲染出来,不再重复写入属性。
* 单独展示:表格里只是把模板参数 `{{{某字段}}}`(或经 `#time` 格式化后的值)渲染出来,不再重复写入属性。
* 结果:每条记录独立存储,查询时 `#ask` 不会再把不同记录里的属性混配,输出就能保持一一对应。
* 结果:每条记录独立存储,查询时 `#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,就解决了一个页面复用模板时,同一参数多个值导致排序混乱的问题。