2016-12-13 19 views
0

previous post에서 완전한 대답을 얻지 못했습니다. 그래서 저는 다른 접근 방식으로 다시 시도하고 있습니다. 하나 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 

내가 내 데비안 GNU/리눅스 시스템에있는 모든이다 [*]


업데이트 : 모든 가능한 FO 문제에 대한 일반적인 해결책을 찾고있는 것이 아니라 단순히 추적 할 방법을 찾고 있습니다. 복잡한 길이의 ssue (s)가 <table> 요소입니다.

[*] 난 당신이 XSL 파일에 정의 제약를 확인하기 위해 XSLT를 사용하는 것을 제안

$ 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가 소스의 오류 + 선을 제공하지 않는다는 제한이 있습니다. – sideshowbarker

+0

샘플 테이블은 CALS 테이블이 아니지만 http://tdg.docbook.org/tdg/5.0/cals.table.html에 링크되어 있습니다. – mzjn

+0

제가 생각할 수있는 유일한 도구는 Schematron입니다. Schematron 규칙을 사용하여 불량 행 발산 값을 탐지하는 것이 가능할 수 있습니다. – mzjn

답변

1

.

난 그냥 모든 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.

012,351,

템플릿을 "db:tbody"에 추가로 추가하거나 다른 요소에 대한 새 템플릿을 작성하여 확장 할 수 있으며 템플릿을 별도의 XSL 파일로 분할하고 <xsl:import/> 또는 <xsl:include/>을 포함하여 템플릿을 모듈화하여 모듈화 할 수 있습니다.

물론 XPath를 지원하는 다른 언어로 비슷한 프로그램을 작성할 수 있지만 이미 XSLT 프로세서가 있습니다.

+0

에 대한 고정 링크'count (parent :: db : tr/preceding-sibling :: db : tr)'이 잘못되었습니다. 왜냐하면'@ rowspan'은이 경우 하나와 같을 것이라고 생각하기 때문입니다. – 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 –