2013-04-11 1 views
2

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

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> 

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

ответ

1

Необходимо указать имя каждого элемента в выражении XPath с помощью пространства имен cat. Попытка:

<xsl:value-of select="cat:schemas/cat:schema/cat:tables/cat:table/@name"/> 
+0

Спасибо Eero. Это решает проблему. Я удрал свои мозги на этом :) –

+0

Рад, что я мог помочь! –

1

Предоставленное преобразование не объявляет пространство имен с префиксом "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" 
+0

Извините, что это была опечатка. Виноват. Мне пришлось изменить некоторые данные перед публикацией здесь. Я исправил это сейчас в вопросе. Моя проблема все еще остается. –

1

Когда ниже 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> 
+0

Спасибо большое! Это решило мою проблему относительно количества столбцов. У меня есть два ответа здесь, хотелось бы отметить их как ответы, но я отмечаю решение Eero как ответ, так как оно было опубликовано раньше и решает проблему, с которой я столкнулся. Но я ценю много! Еще раз спасибо ... –

+0

@SnowLeopard Добро пожаловать – siva2012