Написал на скорую руку тестилку небольшую, на SAX-парсере. Запускается обычно, примерно так:
Код:
java ru.bitel.bgbilling.test.Do_ValidateFo /home/dimon/workspace/bgbilling/webroot/xsl
ну или есть скрипт-запускальщик (под линукс, правда), разобраться несложно...
Код:
./fovalidate.sh /home/dimon/workspace/bgbilling/webroot/xsl
побежит всё, замелькает и для каждого файла в указанной папке будет что-то типа
Код:
...
process file '/home/dimon/workspace/bgbilling/webroot/xsl/bill_pdf_ufanet.xsl'...
line:185,col:89 Внутри fo:table-cell, содержится xsl:call-template, он не является xsl-fo тегом, и ВОЗМОЖНО надо обернуть его в fo:block
line:206,col:89 Внутри fo:table-cell, содержится xsl:call-template, он не является xsl-fo тегом, и ВОЗМОЖНО надо обернуть его в fo:block
line:266,col:21 Внутри fo:table-cell, содержится fo:external-graphic, надо обернуть в fo:block
line:339,col:77 Пустая fo:table-cell, внутри должен быть как минимум один fo:block
...
Ну, тут всё очевидно. Если пишет, что fo:table-cell пустая, то надо туда вставить <fo:block/> как сказано выше. Если что-то кроме fo:block стоит, то надо как минимум всё в fo:table-cell обернуть в fo:block. Кое-что, кажется, можно и не обёрнутым вставлять в ячейку, вроде другую таблицу. Но на всякий случай тут всё предлагается заблочить, хуже точно не будет.
Если внутри что-то стоит не fo-шное, типа всяких xsl-структур, то тут уже надо интеллектуально проверять - после xsl-трансформации окажется ли, что в ячейке блок или нет. Например, очевидно, что это нормально:
Код:
<fo:table-cell>
<xsl:choose>
<xsl:when test="">
<fo:block>что-то тут написано</fo:block>
</xsl:when>
<xsl:otherwise>
<fo:block>что-то тут написано</fo:block>
</xsl:otherwise>
</xsl:choose>
<fo:table-cell>
Но чтобы тестилка не ругалась, я почти везде в наших шаблонах так или иначе заблочил и подобное...
Другой пример:
Код:
<fo:table-cell border-bottom-style="solid"><xsl:attribute name="border-bottom-width"><xsl:value-of select="$weight"/></xsl:attribute>
<fo:block/>
</fo:table-cell>
По идее это тоже нормально, но скриптик тоже сделает варнинг, типа что-то странное, тут уже надо глядеть. Но чтобы опять же не ругалось, подобное можно заменить на такое, например:
Код:
<fo:table-cell border-bottom-style="solid" border-bottom-width="{$weight}">
<fo:block/>
</fo:table-cell>
Других кардинально отличающихся ошибок в наших шаблонах (и тех, что мы видоизменяли на заказ кому-либо) не нашлось, а так как у вас почти наверняка или наши или видоизменённые наши, то это должно почти всё нормально пройти.
upd1Добавлена проверка на некоторые ошибки атрибутов
Цитата:
line:799,col:103; fo:table содержит аттрибут weight="0.7pt", он ошибочный, надо убрать его вместе с его значением
upd2Добавлены ещё проверки + xsd валидация (но на неё обращать всерьёз внимание не нужно, может быть неполноценной, для справки и FO-чистоты)
Цитата:
line:390,col:76; fo:block содержит атрибут white-space-collapse, используете его, чтобы верстать пробельными символами, и он работает некорректно? Дополните его по меньшей мере атрибутом linefeed-treatment="preserve"
Цитата:
line:356,col:20; В таблице (уровень вложенности: 1) описано 2 столбцов, а в строке обнаружено 3
line:405,col:25; В таблице (уровень вложенности: 2) описано 2 столбцов, а в строке обнаружено 4
Цитата:
карточки шаблон
дополнительная валидация по xsd:
xml error: cvc-complex-type.3.2.2: Attribute 'vertical-align' is not allowed to appear in element 'fo:block'., line: -1, column: -1
xml error: cvc-complex-type.2.4.b: The content of element 'fo:table-cell' is not complete. One of '{"http://www.w3.org/1999/XSL/Format":marker, "http://www.w3.org/1999/XSL/Format":block, "http://www.w3.org/1999/XSL/Format":block-container, "http://www.w3.org/1999/XSL/Format":table, "http://www.w3.org/1999/XSL/Format":list-block, "http://www.w3.org/1999/XSL/Format":table-and-caption, "http://www.w3.org/1999/XSL/Format":wrapper, "http://www.w3.org/1999/XSL/Format":retrieve-marker, "http://www.w3.org/1999/XSL/Format":multi-switch, "http://www.w3.org/1999/XSL/Format":multi-properties, "http://www.w3.org/1999/XSL/Format":float, "http://www.w3.org/1999/XSL/Format":footnote}' is expected., line: -1, column: -1
xml error: cvc-complex-type.2.4.b: The content of element 'fo:table-row' is not complete. One of '{"http://www.w3.org/1999/XSL/Format":table-cell}' is expected., line: -1, column: -1
upd3+ новый тест: попытка рендерить в PDF, и вывод уже специфических ошибок конкретно при рендере
+ новые 2 подтеста: отрезание всех скриптов, (которые могли падать лишнего) и запуск ещё раз двух тестов: валидация по xsd и рендер в pdf
+ новый тест: прогрессивная валидация вёрстки таблиц, пытается угадать структуру таблицы и нарисовать чего не так
+ новая фича: более подробный вывод в лог при запуске по отдельному файлу вместо запуска по директории