引用一篇文章中的数据到另一篇文章



(对于否决票:我之所以询问Stack Overflow,是因为这是一个涉及使用MediaWiki模板系统"编程"的问题)

我正在寻找一种在MediaWiki文章页面上包含数据的方法,这样数据值也可以从其他页面引用,而不需要在其他页面上复制数据。最好不要安装额外的延长件。

我所追求的是创建一个看起来像这样的文章页面的能力:

<!-- This page is 'Example' in the main namespace -->
{{Infobox
 | CreationDate = 2015-01-01
 | CreatedBy = John Smith
}}
This article is about the item created by {{d|CreatedBy}}.

当在浏览器中查看此页面时,它应该显示如下:

+------------------------+
|        Example         |
| Created on: 2015-01-01 |
| Created by: John Smith |
+------------------------+
This article is about the item created by John Smith.

然后在另一个页面上,我可以参考上面"示例"页面中的数据,如下所示:

* Example created by {{d|Example|CreatedBy}} on {{d|Example|CreationDate}}

它将显示如下:

* Example created by John Smith on 2015-01-01

这样做的典型用途是将数据放在文章页面上,然后能够提供比使用类别更丰富的列表。目前,列表中的所有数据都是重复的,因此如果它发生了更改,则需要在两个位置进行更新——既在文章中,也在"丰富列表"中。

我想我已经想出了如何做到这一点。首先,正确的解决方案似乎是使用Semantic MediaWiki,这是一个为使用MediaWiki进行数据存储而设计的扩展。然而,在普通的MediaWiki中,这可以通过以下方式实现。

Template:D:页

{{#if:{{{2|}}}|{{:{{{1}}}|{{{2}}}}}
| {{:{{FULLPAGENAME}}|{{{1}}}}}
}}

这使得{{d|Page|Field}}{{d|Field}}能够像在原始问题中一样工作。

信息框代码也需要更改,以便它被以下内容包围:

{{#if:{{{1|}}}|{{#ifeq:{{{1}}}|_valid|1|{{{{{{1}}}|}}}}}|
    <!-- Existing infobox goes here -->
}}

这将启用信息框数据。这意味着您可以将带有其中一个信息框的页面视为模板,并将其包含在另一个页面中。Template:D就是这样做的——它将整篇文章作为模板包括在内,信息框中的这段代码确保了Template:D点不包括整个页面内容,而只包括感兴趣的字段。

它还添加了一个名为_valid的特殊字段,其值为1,可用于检测是否包含有效信息框的页面。如果在使用该页面上的任何字段之前确保{{d|Pagename|_valid}}等于1(例如与{{#ifeq:...}}),则您将获得正确的数据。这一点很重要,因为如果您使用的页面没有启用数据的信息框,那么每次出现Template:D都会嵌入页面的全部内容!

最后,每个信息框都必须更改为这样输入:

<onlyinclude>{{My Infobox|{{{1|}}}
 | Field1 = Value1
 | Field2 = Value2
 | etc.
}}</onlyinclude>

这是必需的,因为MediaWiki无法在模板中嵌入<onlyinclude>标记。信息框名称末尾的|{{{1|}}}用于将字段参数从Template:D传递到文章页面并传递到信息框模板本身。

以下是一个工作示例:

  • 模板:D
  • 启用数据的信息框
  • 页面列表,其中的内容从每个页面的信息框中提取-请注意,此页面使用自定义{{#foreach:}}命令为类别中的每个页面重复wikitext,其中{{#i:}}在每个循环迭代中被替换为页面的名称。因此,{{d|{{#i:}}|Example}}用于在当前循环迭代中从页面中提取Example字段

相关内容

  • 没有找到相关文章

最新更新