Создайте PDF-файл для документирования базы данных в XSLT

У меня есть XML, связанный с базой данных, и мне нужно создать PDF-файл для документирования базы данных. Я использую FOP для преобразования XSLT в PDF.

XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sql-catalog xmlns="http://www.abc.com">
    <schemas>
        <schema name="abc>
            <tables>
                <table name="tab123" degree="1" type="TABLE" rows="144">
                    <columns>
                        <column name="asd" nullable="true" order="1" sqlType="CHARACTER VARYING" sqlLength="255" fixedLength="2"/>
                        <column name="pqr" nullable="true" order="2" sqlType="CHARACTER VARYING" sqlLength="255" fixedLength="2"/>
                    </columns>
                    <constraints/>
                    <datafiles>
                        <datafile href="abc.txt" checksum="6ba3a161d5" size="12354" format="FIXED" valid="true" recordTerminator="&#xD;&#xA;" checksumtype="MD5" rows="905"/>
                    </datafiles>
                </table>
            </tables>
        </schema>
    </schemas>
</sql-catalog>

Мне нужно отобразить имя таблицы, количество столбцов и имя столбца. Я написал следующее в XSLT.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:ora="http://www.oracle.com/XSL/Transform/java/" xmlns:xdofo="http://xmlns.oracle.com/oxp/fo/extensions" xmlns:xdoxslt="http://www.oracle.com/XSL/Transform/java/oracle.apps.xdo.template.rtf.XSLTFunctions" xmlns:xdoxliff="urn:oasis:names:tc:xliff:document:1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:cat="http://www.abc.com">
    <xsl:output method="xml" encoding="ISO-8859-1"/>
    <xsl:template match="cat:sql-catalog">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master master-name="A4" page-height="297mm" page-width="210mm" margin-left="2cm" margin-right="2cm" margin-top="2.0cm" margin-bottom="1.0cm">
            <fo:region-body/>
            <fo:region-after extent="1cm"/>
        </fo:simple-page-master>
      </fo:layout-master-set>

      <fo:page-sequence master-reference="A4">
           <fo:static-content flow-name="xsl-region-after" font-size="8pt">
               <fo:block text-align="right">
                    <fo:page-number/>
               </fo:block>
           </fo:static-content>

      <fo:flow flow-name="xsl-region-body">

            <fo:block font-weight="bold" font-size="8pt" space-after="0.5cm">
                <xsl:value-of select="cat:schemas/schema/tables/table/@name" />
            </fo:block>

        </fo:flow>
    </fo:page-sequence>
    </fo:root>
  </xsl:template>
</xsl:stylesheet>

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


person Snow Leopard    schedule 11.04.2013    source источник


Ответы (3)


Вам необходимо добавить префикс к каждому имени элемента в выражении XPath с пространством имен cat. Пытаться:

<xsl:value-of select="cat:schemas/cat:schema/cat:tables/cat:table/@name"/>
person Eero Helenius    schedule 11.04.2013
comment
Спасибо Ээро. Это решает проблему. Я сломал себе мозги на этом:) - person Snow Leopard; 11.04.2013

Предоставленное преобразование не объявляет никакого пространства имен с префиксом "cat", но этот префикс используется как в шаблонах сопоставления, так и в выражениях XPath.

Вы должны получить сообщение об ошибке, подобное следующему:

Saxon 9.1.0.5J from Saxonica
Java version 1.6.0_31
Error at xsl:template on line 13 column 43 of marrowtr.xsl:
  XPST0081: XSLT Pattern syntax error at char 15 on line 13 in {cat:sql-catalog}:
    Undeclared namespace prefix {cat}

Решение:

Заменить:

xmlns:sqlcat="http://www.abc.comr"

с:

xmlns:cat="http://www.abc.com"
person Dimitre Novatchev    schedule 11.04.2013
comment
Мне жаль, что это была опечатка. Виноват. Мне пришлось изменить некоторые данные, прежде чем публиковать здесь. Я исправил это сейчас в вопросе. Моя проблема все еще остается. - person Snow Leopard; 11.04.2013

Когда приведенный ниже XSLT-запуск на XML получит результат

XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:ora="http://www.oracle.com/XSL/Transform/java/" xmlns:xdofo="http://xmlns.oracle.com/oxp/fo/extensions" xmlns:xdoxslt="http://www.oracle.com/XSL/Transform/java/oracle.apps.xdo.template.rtf.XSLTFunctions" xmlns:xdoxliff="urn:oasis:names:tc:xliff:document:1.1" xmlns:xlink="http://www.w3.org/1999/xlink">
    <xsl:output method="xml" encoding="ISO-8859-1"/>
    <xsl:template match="sql-catalog">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master master-name="A4" page-height="297mm" page-width="210mm" margin-left="2cm" margin-right="2cm" margin-top="2.0cm" margin-bottom="1.0cm">
            <fo:region-body/>
            <fo:region-after extent="1cm"/>
        </fo:simple-page-master>
      </fo:layout-master-set>

      <fo:page-sequence master-reference="A4">
           <fo:static-content flow-name="xsl-region-after" font-size="8pt">
               <fo:block text-align="right">
                    <fo:page-number/>
               </fo:block>
           </fo:static-content>

      <fo:flow flow-name="xsl-region-body">

            <fo:block font-weight="bold" font-size="8pt" space-after="0.5cm">
                <xsl:value-of select="schemas/schema/tables/table/@name" />
            </fo:block>

            <fo:block font-weight="bold" font-size="8pt" space-after="0.5cm">
                <xsl:value-of select="count(schemas/schema/tables/table/columns/column)"/>
            </fo:block>

            <xsl:for-each select="schemas/schema/tables/table/columns/column">
                <fo:block font-weight="bold" font-size="8pt" space-after="0.5cm">
                <xsl:value-of select="@name"/>
                </fo:block>
            </xsl:for-each>
        </fo:flow>
    </fo:page-sequence>
    </fo:root>
  </xsl:template>
</xsl:stylesheet>

Входной XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sql-catalog xmlns:sqlcat="http://www.def.com">
    <schemas>
        <schema name="abc">
            <tables>
                <table name="tab123" degree="1" type="TABLE" rows="144">
                    <columns>
                        <column name="asd" nullable="true" order="1" sqlType="CHARACTER VARYING" sqlLength="255" fixedLength="2"/>
                        <column name="pqr" nullable="true" order="2" sqlType="CHARACTER VARYING" sqlLength="255" fixedLength="2"/>
                    </columns>
                    <constraints/>
                    <datafiles>
                        <datafile href="abc.txt" checksum="6ba3a161d5" size="12354" format="FIXED" valid="true" recordTerminator="&#xD;&#xA;" checksumtype="MD5" rows="905"/>
                    </datafiles>
                </table>
            </tables>
        </schema>
    </schemas>
</sql-catalog>

Вывод:

<?xml version='1.0' encoding='ISO-8859-1' ?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xdoxslt="http://www.oracle.com/XSL/Transform/java/oracle.apps.xdo.template.rtf.XSLTFunctions" xmlns:ora="http://www.oracle.com/XSL/Transform/java/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xdofo="http://xmlns.oracle.com/oxp/fo/extensions" xmlns:xdoxliff="urn:oasis:names:tc:xliff:document:1.1"><fo:layout-master-set><fo:simple-page-master master-name="A4" page-height="297mm" page-width="210mm" margin-left="2cm" margin-right="2cm" margin-top="2.0cm" margin-bottom="1.0cm"><fo:region-body/><fo:region-after extent="1cm"/></fo:simple-page-master></fo:layout-master-set><fo:page-sequence master-reference="A4"><fo:static-content flow-name="xsl-region-after" font-size="8pt"><fo:block text-align="right"><fo:page-number/></fo:block></fo:static-content><fo:flow flow-name="xsl-region-body"><fo:block font-weight="bold" font-size="8pt" space-after="0.5cm">tab123</fo:block><fo:block font-weight="bold" font-size="8pt" space-after="0.5cm">2</fo:block><fo:block font-weight="bold" font-size="8pt" space-after="0.5cm">asd</fo:block><fo:block font-weight="bold" font-size="8pt" space-after="0.5cm">pqr</fo:block></fo:flow></fo:page-sequence></fo:root>
person siva2012    schedule 11.04.2013
comment
Большое спасибо! Это решило мою проблему с количеством столбцов. У меня здесь два ответа, хотелось бы пометить их оба как ответы, но я отмечаю решение Ээро как ответ, поскольку оно было опубликовано ранее и решает проблему, с которой я столкнулся. Но я многое ценю! Спасибо еще раз... - person Snow Leopard; 11.04.2013
comment
@SnowLeopard Добро пожаловать - person siva2012; 11.04.2013