8

我正在尝试从 VisualForce 页面生成干净的 XSL-FO。但是由于嵌套的 apex:outputPanel 标记(外部渲染=true,内部渲染=false)生成的空跨度标记,来自 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>

实际上,我确实在文档中找到了一个晦涩的原因:

apex:outputPanel 布局属性 - 面板的布局样式。可能的值包括“block”(生成 HTML div 标签)、“inline”(生成 HTML span 标签)和“none”(不生成 HTML 标签)。如果未指定,此值默认为“无”。但是,如果 layout 设置为“none”,对于每个 render 属性设置为“false”的子元素,outputPanel 生成一个 span 标签,每个子元素的 ID 和 style 属性设置为“display:none” . 因此,虽然内容不可见,但 JavaScript 仍然可以通过 DOM ID 访问元素。

如果我的内容类型是 html 或 javascript,这听起来很有用,但它打破了我严格的 xml。那么问题来了:如何在避免span标签的同时实现嵌套条件渲染?

4

2 回答 2

10

将两者或仅将外部切换到顶点:变量,如下所示:

<apex:variable rendered="true" value="" var="tempOuter">
    <apex:outputPanel layout="none" rendered="false" />
</apex:variable>
于 2012-09-16T04:08:09.323 回答
0

尝试使用<apex:outputText>而不是<apex:outputPanel>. 在我的例子中,我将一个表格渲染成 pdf 文档,并<apex:outputPanel>打破了表格布局,同时<apex:outputText>完美地工作,并支持这样的条件渲染:

<apex:outputText rendered="{!IF(Sum != 0.00, true, false)}">
于 2021-11-19T15:39:28.800 回答