覆盖组件的可见性

Visibility of an overriden component

Binding References to Components 中有一个我觉得令人困惑的例子:

<xsl:package name="P" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:use-package name="Q">
    <xsl:override>
      <xsl:variable name="C" visibility="private" select="$xsl:original + 3"/>
    </xsl:override>
  </xsl:use-package>

  <xsl:template name="T" visibility="public">
    <xsl:value-of select="$A"/>
  </xsl:template>
</xsl:package>

然后它说:

The visibility is changed according to the rules in 3.5.3.2 Accepting Components: in particular, visibility="private" changes to visibility="hidden".

为什么需要指定 private 才能将可见性更改为 hidden?我希望,由于您正在覆盖组件,原始覆盖的组件会自动隐藏,并且使用和使用包中的所有符号引用都引用新的覆盖组件。

Component Cp is the overriding component. Its properties are exactly as if it were declared as a top-level component in P (outside the xsl:use-package element)...

这意味着 C 对任何使用包可见,但它被标记为 private

有 3 个名为 C 的组件。C(Q) 是 Q 中声明的组件,并且在 Q 中是 public。C(PQ) 是该组件在 P 中的 "copy" , 并且隐藏在 P 中,因为存在覆盖声明;它不能使用名称 C 调用,只能使用名称 xsl:original。 C(P) 是 P 中的重写组件。它在 P 中是私有的,因为重写声明具有 visibility="private"。我认为下面的 table 有一个错误,它说 C(P) 是 public.

请随时通过在 W3C bugzilla 上提出这些问题直接向工作组提出这些问题,即使它们只是需要澄清的问题。欢迎所有反馈:事实上,W3C 会监控反馈的数量。

== PS ==

XSL WG(恰好在本周开会)对此进行了审查,并同意 C(P) 的可见性应该是私有的 (*)。参见 https://www.w3.org/Bugs/Public/show_bug.cgi?id=29468

请注意,对 3.5.3.2 接受组件的引用并不直接相关,因为那里的规则讨论了在没有 xsl:override 元素的情况下会发生什么。

感谢您的反馈。

(*):我已更正此问题。我最初写的是 "public".