2013-04-02 4 views
3

У меня есть одна строка, а один из столбцов имеет список данных. Скажем, у меня есть строка, третий столбец имеет 0 или более строк. <xsl:for-each select="./parts"> и по какой-то причине код, который у меня есть, кажется, не работает. Я не уверен, как его реализовать. Я получаю эту ошибку.Как разрешить xsl: fo разрешить ячейке таблицы принимать пустые блоки и печатать несколько строк

org.apache.fop.events.LoggingEventListener ProcessEvent Следующая функция не реализуется Apache FOP, еще: настольный макет = "Авто" (по ВОК: таблицы) (без контекста информация доступна) [4/1/13 19: 14: 38: 002 CDT] 00000053 SystemErr R org.apache.fop.fo.ValidationException: «fo: table-cell» отсутствует дочерние элементы. Требуемое содержание модели: маркер * (% блок;) + (Нет информации контекста доступна)

У меня есть этот код, и это не работает.

<xsl:for-each select="./List"> 
    <fo:table-row> 
    <fo:table-cell border="solid 1px" text-align="center"> 
     <fo:block font-size="8pt"><xsl:value-of select="group" /></fo:block> 
    <fo:table-cell> 
    <fo:table-cell border="solid 1px" text-align="left"> 
    <xsl:for-each select="./parts"> 
     <fo:block font-size="8pt"><xsl:value-of select="partNumber" /><fo:leader /> 
     </fo:block> 
    </xsl:for-each> 
    </fo:table-cell> 
</fo:table-row> 
</xsl:for-each> 
+0

Опубликовать также свой xml пожалуйста, чтобы проверить ваш xslt на нем – MikroDel

ответ

1

Кажется иногда код:

<xsl:for-each select="./parts"> 
    <fo:block font-size="8pt"><xsl:value-of select="partNumber" /><fo:leader /> 
    </fo:block> 
</xsl:for-each> 

не возвращает ничего. Вам нужно поместить его в переменную и проверить. Если нет значения пустым, чтобы избежать этой ошибки.

3

попробуйте устранить строгие валидация:

fopFactory.setStrictValidation(false);

+2

'-r' флаг в FOP CLI. –

1

Если вы посмотрите в W3 XSL-FO spec for fo:table-cell вы увидите

Contents: 

(%block;)+ 

Знак + означает "один или более", то есть обязательно

и объект% блока составляют defined as follows от W3

The parameter entity, "%block;" in the content models below, contains the following formatting objects: 

    block 
    block-container 
    table-and-caption 
    table 
    list-block 

Итак, Навин Рават прав, вам нужно убедиться, что что-то внутри вашей камеры.

/Колй

3

Итак, проблема Вашего получения исходит из этого блока.

<fo:table-cell border="solid 1px" text-align="left"> 
    <xsl:for-each select="./parts"> 
     <fo:block font-size="8pt"><xsl:value-of select="partNumber" /><fo:leader /> 
     </fo:block> 
    </xsl:for-each> 
    </fo:table-cell> 

Как я считаю, другие уже указали, что если у вас есть 0 элементов элементов, то ваша ячейка таблицы не имеет дочернего блока. Как я вижу это, есть два простых исправления. Во-первых, попробуйте обернуть ваш оператор for-each в другом блочном элементе.

<fo:table-cell border="solid 1px" text-align="left"> 
<fo:block> 
    <xsl:for-each select="./parts"> 
     <fo:block font-size="8pt"><xsl:value-of select="partNumber" /><fo:leader /> 
     </fo:block> 
    </xsl:for-each> 
<fo:block> 
    </fo:table-cell> 

Если вы обнаружили, что есть нежелательные последствия для вашего форматирования, вы можете играть с подкладкой и другими свойствами, так что добавлен блок по-прежнему сохраняет ваше выравнивание. Это точно определит вашу проблему. Несколько более сложной альтернативой было бы использовать инструкцию xsl: select, которая проверяет, есть ли хотя бы одна часть, прежде чем пытаться перебирать их, иначе она вставляет пустой блок.

<fo:table-cell border="solid 1px" text-align="left"> 
<xsl:choose> 
<xsl:when test="count(./parts) &gt; 0"> 
    <xsl:for-each select="./parts"> 
     <fo:block font-size="8pt"><xsl:value-of select="partNumber" /><fo:leader /> 
     </fo:block> 
    </xsl:for-each> 
</xsl:when> 
<xsl:otherwise> 
<fo:block>&#160;</fo:block> 
</xsl:otherwise> 
</xsl:choose> 
    </fo:table-cell> 

Хотя это больше, она более расширяемой, например, если в будущем момент вы хотели, чтобы отобразить список частей, если имеются данные, и если не отображать другое значение (которое также может или может отсутствовать), вы можете просто добавить еще один блок, чтобы уменьшить это изменение в логике.

Последнее примечание: блок, который я помещал в заявление, содержащем  , является просто кодировкой для одного пробела. Если вы хотите, чтобы ваш «пустой» блок по-прежнему сохранял пробел (т. Е. Останавливал его при свертывании, если текстового содержимого нет), вы можете использовать пустое пространство, чтобы блокировать блок, иначе, если вам все равно он рушится или нет, просто удалите пробел.