如何将原始XML数据传递给MediaWiki模板?

问题描述

这是如何在Mediawiki中显示代码

<Syntaxhighlight lang="xml" line>
    <abc x="123" />
</Syntaxhighlight>

在此示例中,“ <abc x="123"/>”将正确呈现。但是,如果我想将此XML代码片段“ <abc x="123"/>”传递给某个任意模板,而 会将这些内容传递给Syntaxhighlight扩展名呢?如何才能做到这一点?标准方法似乎无效。


我已经发现的东西:

  • 可以通过Syntaxhighlight调用{{#tag:Syntaxhighlight{<Nowiki>...</Nowiki>}|lang="xml"|line=1}}扩展名。可以将其放入模板中。
  • 将一些任意XML内容传递给模板似乎是问题所在。无论我尝试什么,似乎都行不通。即使使用<也无济于事:在这种情况下,所有“ &lt;”都将替换为“ SVGExample”。

您对此有什么想法甚至知道解决方案吗?


更新:我做了全新安装的MW 1.34.3,以便与尝试在stackoverflow上为我提供帮助的人们尽可能完全相同。现在:

  • MW:1.34.3
  • SMW:3.2.0
  • 语法高亮:2.0

名为{{#tag:Syntaxhighlight|{{{1|}}}|lang="xml"|line=1}} 的模板:

{{SVGExample|<Nowiki><abc x="123"/></Nowiki>}}

Wiki页面内容

1   &lt;abc x="123"/&gt;

结果:

MagicNoCache

这似乎与Mediawiki扩展无关。我停用了SyntaxHighlight_GeSHiParserFunctions&lt;以外的所有扩展名,并得到了相同的结果。


为想要深入了解此内容的人更新:

解决占位符似乎在这里引入了问题。即使采用建议的将数据传递给参数的方式,也需要进行一些处理:过滤掉注释。我在自定义扩展程序中的实验表明,一旦您解析了传递给模板的参数,数据就会被HTML编码,从而导致不必要的$parser->recursiveTagParse(...)实体(和其他实体)。 SyntaxHighlight扩展程序通过某种方式来避免这种现象,因为它在解决模板参数后接收原始数据时会避免这种现象,在这种情况下,使用input(print('> '))的经典方法在这方面失败了。

解决方法

创建一个模板,例如Template:Xml

<includeonly>{{#tag:syntaxhighlight|{{{1|}}}|lang="xml"|line=1}}</includeonly>

以如下方式调用此模板:{{xml|1=<abc x="123" />}}。注意|1=

或者,将Template:=创建为=并调用{{xml|<abc x{{=}}"123" />}},将每个等号转义:={{=}}

解析器函数的匿名参数中的等号需要转义,以便MediaWiki不会将其用作参数名称和值之间的分隔符。

因此,另一种选择是使用命名参数声明Template:xml,如下所示:

<includeonly>{{#tag:syntaxhighlight|{{{xml|}}}|lang="xml"|line=1}}</includeonly>

并这样称呼:{{xml|xml=<abc x="123" />}}