2016-12-13 4 views
0

previous postで完全な回答を得ることができませんでした。だから私はもう一度別のアプローチを試みています。 1はtableと、次のDocBookの記事の誤りを検出する方法をdocbook 5.0のドキュメントのテーブル要素のエラーを検出しました

:私はエラーが私の入力のDocBook文書内にある場合、私は知っている小さな再現可能な例を作ったので、明らかに

$ cat article.xml 
<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<article xmlns="http://docbook.org/ns/docbook" version="5.0"> 
    <title>Title</title> 
    <table> 
    <caption>caption</caption> 
    <tbody> 
     <tr> 
     <td rowspan="2"> 
      <para>my para</para> 
     </td> 
     </tr> 
    </tbody> 
    </table> 
</article> 

は、私の質問ではなく、についてですそれらを検出し、それらを効率的に追跡するためのコマンドラインツール(行番号と場合によっては列オフセット)があります。

私は、入力されたdocbook 5.0(XML)ドキュメントまたは入力書式設定オブジェクト(FOファイル)を使用してエラーを検出する回答のみ受け付けます。

答えは一連のコマンドラインツール(ソフトウェア 'X'を使用するのは受け入れられない答え)で明示的に指定する必要があります。

は、理想的には私は、私は単純に実行することができると思いを持っているでしょう。ここでは参考のため

$ xmllint --nonet --noout --schema /usr/share/xml/docbook/schema/xsd/5.0/docbook.xsd article.xml 
article.xml validates 

または

$ jing /usr/share/xml/docbook/schema/rng/5.0/docbook.rng article.xml && echo "success" 
success 

は私のDebian GNU/Linuxシステム上で持っているすべてである[*]


更新:すべての可能なFO問題の一般的な解決策を探しているわけではありません。私は単に私を追跡する方法を探していますssue(s)は長く複雑な要素である。<table>要素。

[*]

$ xsltproc -o article.fo /usr/share/xml/docbook/stylesheet/docbook-xsl/fo/docbook.xsl article.xml && fop article.fo article.pdf 
Note: namesp. cut : stripped namespace before processing   Additional Protocols 
Note: namesp. cut : processing stripped document     Additional Protocols 
Making portrait pages on USletter paper (8.5inx11in) 
[WARN] FOUserAgent - The following feature isn't implemented by Apache FOP, yet: table-layout="auto" (on fo:table) (See position 2:30164) 
[ERROR] FOP - Exception <org.apache.fop.apps.FOPException: org.apache.fop.fo.ValidationException: A table-cell is spanning more rows than available in its parent element. 
javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: A table-cell is spanning more rows than available in its parent element.>org.apache.fop.apps.FOPException: org.apache.fop.fo.ValidationException: A table-cell is spanning more rows than available in its parent element. 
javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: A table-cell is spanning more rows than available in its parent element. 
    at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:288) 
    at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:115) 
    at org.apache.fop.cli.Main.startFOP(Main.java:186) 
    at org.apache.fop.cli.Main.main(Main.java:217) 
Caused by: javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: A table-cell is spanning more rows than available in its parent element. 
    at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:502) 
    at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:285) 
    ... 3 more 
Caused by: org.apache.fop.fo.ValidationException: A table-cell is spanning more rows than available in its parent element. 
    at org.apache.fop.fo.flow.table.FixedColRowGroupBuilder.endTablePart(FixedColRowGroupBuilder.java:183) 
    at org.apache.fop.fo.flow.table.VariableColRowGroupBuilder$6.play(VariableColRowGroupBuilder.java:107) 
    at org.apache.fop.fo.flow.table.VariableColRowGroupBuilder.endTable(VariableColRowGroupBuilder.java:116) 
    at org.apache.fop.fo.flow.table.Table.finalizeNode(Table.java:260) 
    at org.apache.fop.fo.FONode.endOfNode(FONode.java:330) 
    at org.apache.fop.fo.flow.table.Table.endOfNode(Table.java:243) 
    at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.endElement(FOTreeBuilder.java:360) 
    at org.apache.fop.fo.FOTreeBuilder.endElement(FOTreeBuilder.java:190) 
    at org.apache.xalan.transformer.TransformerIdentityImpl.endElement(TransformerIdentityImpl.java:1102) 
    at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source) 
    at org.apache.xerces.xinclude.XIncludeHandler.endElement(Unknown Source) 
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
    at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:485) 
    ... 4 more 

--------- 

javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: A table-cell is spanning more rows than available in its parent element. 
    at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:502) 
    at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:285) 
    at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:115) 
    at org.apache.fop.cli.Main.startFOP(Main.java:186) 
    at org.apache.fop.cli.Main.main(Main.java:217) 
Caused by: org.apache.fop.fo.ValidationException: A table-cell is spanning more rows than available in its parent element. 
    at org.apache.fop.fo.flow.table.FixedColRowGroupBuilder.endTablePart(FixedColRowGroupBuilder.java:183) 
    at org.apache.fop.fo.flow.table.VariableColRowGroupBuilder$6.play(VariableColRowGroupBuilder.java:107) 
    at org.apache.fop.fo.flow.table.VariableColRowGroupBuilder.endTable(VariableColRowGroupBuilder.java:116) 
    at org.apache.fop.fo.flow.table.Table.finalizeNode(Table.java:260) 
    at org.apache.fop.fo.FONode.endOfNode(FONode.java:330) 
    at org.apache.fop.fo.flow.table.Table.endOfNode(Table.java:243) 
    at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.endElement(FOTreeBuilder.java:360) 
    at org.apache.fop.fo.FOTreeBuilder.endElement(FOTreeBuilder.java:190) 
    at org.apache.xalan.transformer.TransformerIdentityImpl.endElement(TransformerIdentityImpl.java:1102) 
    at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source) 
    at org.apache.xerces.xinclude.XIncludeHandler.endElement(Unknown Source) 
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
    at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:485) 
    ... 4 more 
--------- 
org.apache.fop.fo.ValidationException: A table-cell is spanning more rows than available in its parent element. 
    at org.apache.fop.fo.flow.table.FixedColRowGroupBuilder.endTablePart(FixedColRowGroupBuilder.java:183) 
    at org.apache.fop.fo.flow.table.VariableColRowGroupBuilder$6.play(VariableColRowGroupBuilder.java:107) 
    at org.apache.fop.fo.flow.table.VariableColRowGroupBuilder.endTable(VariableColRowGroupBuilder.java:116) 
    at org.apache.fop.fo.flow.table.Table.finalizeNode(Table.java:260) 
    at org.apache.fop.fo.FONode.endOfNode(FONode.java:330) 
    at org.apache.fop.fo.flow.table.Table.endOfNode(Table.java:243) 
    at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.endElement(FOTreeBuilder.java:360) 
    at org.apache.fop.fo.FOTreeBuilder.endElement(FOTreeBuilder.java:190) 
    at org.apache.xalan.transformer.TransformerIdentityImpl.endElement(TransformerIdentityImpl.java:1102) 
    at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source) 
    at org.apache.xerces.xinclude.XIncludeHandler.endElement(Unknown Source) 
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
    at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:485) 
    at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:285) 
    at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:115) 
    at org.apache.fop.cli.Main.startFOP(Main.java:186) 
    at org.apache.fop.cli.Main.main(Main.java:217) 
+1

http://stackoverflow.com/questions/18998498/validate-fo-file/19001319#19001319の回答を参照し、https://www.oxygenxml.com/forum/topic7924.html#p24197:「The XSL-FOの問題は、完全かつ適切に検証できるツールがないことです。XMLスキーマは、XSL-FO出力ファイルにあるすべての制約を指定することはできません。*私にとって最良の検証は、XSL-FOをPDFに処理して、プロセッサが警告やエラーを発生させるようにすることです* FOPがソースのエラーの行+ colを与えないという制限があります。 – sideshowbarker

+0

サンプルテーブルはCALSテーブルではありませんが、http://tdg.docbook.org/tdg/5.0/cals.table.htmlにリンクしています。 – mzjn

+0

私が考えることができる唯一のツールは、Schematronです。 Schematronルールを使用して不正な行スパン値を検出することは可能です。 – mzjn

答えて

1

私はあなたがXSLファイルで定義された制約をチェックするためにXSLTを使用して提案します。

私はちょうどすべてのtdの要素を反復処理、その後、あなたは"db:tbody"カウント可能な行数のためxsltproc check-tables.xsl article.xml

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:db="http://docbook.org/ns/docbook" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!-- Author: Alberto González Palomo http://sentido-labs.com 
     2016-12-24 00:20 --> 

    <!-- BEGIN checks --> 

    <xsl:template match="db:tbody"> 
    <xsl:variable name="row-count" select="count(db:tr)"/> 
    <xsl:for-each select=".//db:td[@rowspan]"> 
     <xsl:variable name="last-row-spanned" select="count(parent::db:tr/preceding-sibling::db:tr) + @rowspan"/> 
     <xsl:if test="$last-row-spanned &gt; $row-count"> 
     <xsl:call-template name="error"> 
      <!-- Optional in this case: 
       <xsl:with-param name="location" select="."/> 
      --> 
      <xsl:with-param name="message">A table-cell is spanning more rows than available in its parent element.</xsl:with-param> 
     </xsl:call-template> 
     </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 

    <!-- END checks --> 


    <xsl:output method="text"/> 

    <xsl:template match="text()"><!-- Omit text content. --></xsl:template> 

    <xsl:template name="error"> 
    <xsl:param name="location" select="."/> 
    <xsl:param name="message">No error message available.</xsl:param> 

    <!-- To stop at the first error, set the attribute terminate="yes". 
     In xsltproc, this also causes the process to return a failure value. 
     --> 
    <xsl:message terminate="no"> 
     <xsl:text>Error: </xsl:text> 
     <xsl:call-template name="xpath"> 
     <xsl:with-param name="location" select="$location"/> 
     </xsl:call-template> 
     <xsl:text>: </xsl:text> 
     <xsl:value-of select="$message"/> 
    </xsl:message> 
    </xsl:template> 

    <xsl:template name="xpath"> 
    <xsl:param name="location" select="."/> 
    <xsl:for-each select="$location/parent::*"> 
     <xsl:call-template name="xpath"/> 
    </xsl:for-each> 

    <xsl:text>/</xsl:text> 
    <xsl:variable name="element-name" select="name($location)"/> 
    <xsl:value-of select="$element-name"/> 

    <xsl:variable name="preceding" select="count($location/preceding-sibling::*[name() = $element-name])"/> 
    <xsl:variable name="following" select="count($location/following-sibling::*[name() = $element-name])"/> 
    <xsl:if test="$preceding + $following &gt; 0"> 
     <xsl:text>[</xsl:text> 
     <xsl:value-of select="1 + $preceding"/> 
     <xsl:text>]</xsl:text> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

でテンプレートを実行することができますあなたが言及したその特定の問題を検出するためのそのようなファイルを、用意しましたそれは@rowspan属性を持つ要素の位置と@rowspanの合計がtbodytr行数よりも大きい場合は、エラーメッセージを出力します。

Error: /article/table/tbody/tr/td : A table-cell is spanning more rows than available in its parent element.

"db:tbody"テンプレートでチェックを追加するか、または他の要素用の新しいテンプレートを作成して拡張することができます。テンプレートを別々のXSLファイルに分割し、<xsl:import/>または<xsl:include/>でテンプレートを分割してモジュール化することができます。

他の言語でも同様のプログラムをXPathでサポートしていますが、既にXSLTプロセッサが手元にあります。

+0

'count(parent :: db:tr/preceding-sibling :: db:tr)'が間違っていますこの場合、 '@ rowspan'は1に等しいと仮定しているからです。 – malat

+0

@malatこんにちは、カウントは問題の行の前の行の数を返します。そして、私たちは '@ rowspan'の値を持っています。したがって、この行の前に '5 '行があり、この行の行スパンが' 3'の場合、最後の行の1から始まるインデックスは '5 + 3 = 8'になります。 –

+0

@malatこんにちは、多分あなたは何を意味するかは、式は現在の行の前にあるすべての行が1の行スパンを持つことを前提としています。 HTML標準[html]によると、1より大きいrowspanを持つ現在の行の上のセルは、セルを押し下げるのではなく、右に移動するので、問題ありません。 '@ rowspan'はどこにでも行を追加しません。そうでなければ、fopは文句を言わずに余分な行を追加します。 [html] https://www.w3.org/TR/html401/struct/tables.html#h-11.2.6.1 –

関連する問題