如何将原始 XML 数据传递给 MediaWiki 模板?
How can I pass raw XML data to a MediaWiki template?
这是在 MediaWiki 中显示源代码的方式:
<syntaxhighlight lang="xml" line>
<abc x="123" />
</syntaxhighlight>
在此示例中,“<abc x="123"/>
”将被正确呈现。但是,如果我想将此 XML 片段“<abc x="123"/>
”传递给某个任意模板,而该模板 又 会将此内容传递给 syntaxhighlight
延期?如何才能做到这一点?标准方法似乎不起作用。
我已经想通了:
- 可以通过
{{#tag:syntaxhighlight{{{1}}}|lang="xml"|line=1}}
调用 syntaxhighlight
扩展。这可以放入模板中。
- 向模板传递一些任意 XML 内容似乎是问题所在。无论我尝试什么似乎都不起作用。即使使用
<nowiki>...</nowiki>
也无济于事:在这种情况下,所有“<
”都会被“<
”替换。
你有什么想法,甚至知道解决这个问题的方法吗?
更新:我重新安装了 MW 1.34.3,以使其与试图在 Whosebug 上帮助我的人尽可能相同。现在:
- 分子量:1.34.3
- SMW: 3.2.0
- 语法高亮:2.0
名为SVGExample
的模板:
{{#tag:syntaxhighlight|{{{1|}}}|lang="xml"|line=1}}
维基页面内容:
{{SVGExample|<nowiki><abc x="123"/></nowiki>}}
结果:
1 <abc x="123"/>
看来不是MediaWiki扩展的问题。我停用了除 MagicNoCache
、SyntaxHighlight_GeSHi
、ParserFunctions
之外的所有扩展,我得到了相同的结果。
更新给那些想深入研究的人:
看来解决占位符问题就在这里引入了。即使使用建议的将数据传递给参数的方式,也有一些处理:注释被过滤掉。我在自定义扩展中的实验表明,一旦您解析传递给模板的参数,数据就会得到 HTML 编码,从而导致不需要的 <
实体(和其他实体)。 SyntaxHighlight 扩展做了某种魔法来避免这种现象,因为它在解析模板参数后接收原始数据,而 $parser->recursiveTagParse(...)
的经典方法在这方面失败了。
创建一个模板,比如说,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" />}}
.
这是在 MediaWiki 中显示源代码的方式:
<syntaxhighlight lang="xml" line>
<abc x="123" />
</syntaxhighlight>
在此示例中,“<abc x="123"/>
”将被正确呈现。但是,如果我想将此 XML 片段“<abc x="123"/>
”传递给某个任意模板,而该模板 又 会将此内容传递给 syntaxhighlight
延期?如何才能做到这一点?标准方法似乎不起作用。
我已经想通了:
- 可以通过
{{#tag:syntaxhighlight{{{1}}}|lang="xml"|line=1}}
调用syntaxhighlight
扩展。这可以放入模板中。 - 向模板传递一些任意 XML 内容似乎是问题所在。无论我尝试什么似乎都不起作用。即使使用
<nowiki>...</nowiki>
也无济于事:在这种情况下,所有“<
”都会被“<
”替换。
你有什么想法,甚至知道解决这个问题的方法吗?
更新:我重新安装了 MW 1.34.3,以使其与试图在 Whosebug 上帮助我的人尽可能相同。现在:
- 分子量:1.34.3
- SMW: 3.2.0
- 语法高亮:2.0
名为SVGExample
的模板:
{{#tag:syntaxhighlight|{{{1|}}}|lang="xml"|line=1}}
维基页面内容:
{{SVGExample|<nowiki><abc x="123"/></nowiki>}}
结果:
1 <abc x="123"/>
看来不是MediaWiki扩展的问题。我停用了除 MagicNoCache
、SyntaxHighlight_GeSHi
、ParserFunctions
之外的所有扩展,我得到了相同的结果。
更新给那些想深入研究的人:
看来解决占位符问题就在这里引入了。即使使用建议的将数据传递给参数的方式,也有一些处理:注释被过滤掉。我在自定义扩展中的实验表明,一旦您解析传递给模板的参数,数据就会得到 HTML 编码,从而导致不需要的 <
实体(和其他实体)。 SyntaxHighlight 扩展做了某种魔法来避免这种现象,因为它在解析模板参数后接收原始数据,而 $parser->recursiveTagParse(...)
的经典方法在这方面失败了。
创建一个模板,比如说,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" />}}
.