我正在尝试从VisualForce页面生成干净的XSL-FO。但是,由于嵌套的apex:outputPanel标签(外部渲染=真,内部渲染=假)生成的空跨度标记,因此来自VisualForce页面的xml无效。这是一个专注的页面,说明了问题:
<apex:page contentType="text/xml" cache="false" showHeader="false" sidebar="false">
<root>
There is no reason for a nested apex:outputpanel to generate a span tag like this:
<apex:outputPanel layout="none" rendered="true">
<apex:outputPanel layout="none" rendered="false" />
</apex:outputPanel>
This breaks strict xml documents like XSL-FO.
</root>
</apex:page>
该页面给出了这个xml输出:
<root>
There is no reason for a nested apex:outputpanel to generate a span tag like this:
<span id="j_id0:j_id3" style="display: none;"></span>
This breaks strict xml documents like XSL-FO.
</root>
实际上,我确实在docs中找到了一个模糊不清的原因:
apex:outputPanel布局属性 - 面板的布局样式。可能的值包括“block”(生成HTML div标签),“inline”(生成HTML span标签)和“none”(不生成HTML标签)。如果未指定,则此值默认为“none”。但是,如果layout设置为“none”,为渲染属性设置为“false”的每个子元素,则outputPanel会生成一个span标记,其中包含每个子元素的ID,以及一个样式属性设为“display:none”。因此,虽然内容不可见,但JavaScript仍然可以通过DOM ID访问元素。
如果我的内容类型是html或javascript,听起来很有用,但是它违反了我的严格xml。所以问题是:如何在避免span标签的同时实现嵌套条件渲染?
答案 0 :(得分:7)
将两者或仅外部切换为apex:变量,如下所示:
<apex:variable rendered="true" value="" var="tempOuter">
<apex:outputPanel layout="none" rendered="false" />
</apex:variable>