2013-03-20 2 views
2

요구는 :XProc에서 Doctype 선언을 동적으로 생성하는 방법은 무엇입니까?

  • [입력 XML의 루트 요소 챕터 또는 섹션 요소가 될 수있는 상기 XML 출력에 올바른 DOCTYPE 선언을 추가하는 것이다. 인스턴스의 경우 공개 요소 식별자가 PUBLIC "-/OASIS // DTD DocBook Chap XML V4.5 // EN"이며 시스템 식별자가 "chap.dtd"인 것으로 간주합니다. 섹션 요소 공개 식별자에 대한 Simillary는 PUBLIC "-/OASIS // DTD DocBook Sec XML V4.5 // EN"이며 시스템 식별자는 "sec.dtd"입니다.

입력 XML1 : chapter.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook Chap XML V4.5//EN" "chap.dtd"> 
<chapter> 
    <title>Chapter Template Title</title> 
    <para>Text</para> 
    <section> 
     <title>Section Title</title> 
     <para>Section text</para> 
    </section> 
</chapter> 

입력 XML2 : section.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook Chap XML V4.5//EN" "chap.dtd"> 
<section> 
    <title>Section Title</title> 
    <para>Section text</para> 
</section> 

XSLT 파일 : test.xsl :

스타일 시트 그냥 내가 사본 nput 출력 XML과 입력 XML 루트 요소이거나 입력

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:template name="add-doctype-declaration"> 
    <xsl:choose> 
     <xsl:when test="/chapter"> 
      <xsl:text disable-output-escaping="yes"> 
&lt;!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook Chap XML V4.5//EN" "chap.dtd"&gt; 
</xsl:text> 
     </xsl:when> 
     <xsl:when test="/section"> 
      <xsl:text disable-output-escaping="yes"> 
&lt;!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook Sec XML V4.5//EN" "sec.dtd"&gt; 
</xsl:text> 
     </xsl:when> 
    </xsl:choose> 
</xsl:template> 

<xsl:template match="/"> 
    <xsl:call-template name="add-doctype-declaration"/> 
    <xsl:apply-templates/> 
</xsl:template> 

<!-- Identity Template --> 
<xsl:template match="@*|*|processing-instruction()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="section"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:attribute name="sec"> 
      <xsl:number/> 
     </xsl:attribute> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

예상 output.xml 요소 수 때문에, 스타일 시트 XML 출력 올바른 DOCTYPE 선언 추가 모든 섹션 요소 @sec 추가 XML1

입력 XML2

<?xml version="1.0" encoding="utf-8"?> Input XML1: 
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook Sec XML V4.5//EN" "sec.dtd"> 
<section sec="1"> 
    <title>Section Title</title> 
    <para>Section text</para> 
</section> 
,691,363에 대한 는
<?xml version="1.0" encoding="utf-8"?> Input XML1: 
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook Chap XML V4.5//EN" "chap.dtd"> 
<chapter> 
    <title>Chapter Template Title</title> 
    <para>Text</para> 
    <section sec="1"> 
     <title>Section Title</title> 
     <para>Section text</para> 
    </section> 
</chapter> 

예상 output.xml210

XSLT 엔진을 사용하면 변환이 완벽하게 작동하고 예상 출력을 얻을 수 있습니다.

XProc를 통해 변환을 수행하면 다음 오류가 발생합니다. 누군가가이 오류를 해결하는 데 도움을 줄 수 있습니까?

오류 : XD0001 : XD0001 비 XML 자원이 단계 출력에서 ​​생성되거나 단계 입력에 도달하면 동적 오류입니다.

XProc 파일 : 테스트.XPL

<?xml version="1.0" encoding="UTF-8"?> 
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" 
    xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0" name="testing"> 
    <p:input port="source"> 
     <p:document href="chapter.xml"/> 
    </p:input> 
    <p:output port="result"> 
     <p:empty/> 
    </p:output> 

    <p:xslt version="1.0" name="transform"> 
     <p:input port="stylesheet"> 
      <p:document href="test.xsl"/> 
     </p:input> 
     <p:input port="parameters"> 
      <p:empty/> 
     </p:input> 
    </p:xslt> 

    <!-- Assume that there is another transform happening for chapter/section xml --> 
    <p:xslt version="1.0" name="transform2"> 
     <p:input port="stylesheet"> 
      <p:document href="test2.xsl"/> 
     </p:input> 
     <p:input port="parameters"> 
      <p:empty/> 
     </p:input> 
    </p:xslt> 


    <p:store omit-xml-declaration="false" encoding="utf-8" name="serialize"> 
     <p:with-option name="href" select="output.xml"/> 
    </p:store> 

</p:declare-step> 

답변

1

은 다시 당신이의 DOCTYPE 세대

http://www.sharexml.com/x/get?k=uWn0KA7RThnt

http://www.sharexml.com/x/get?k=wAJlbUJfzIYQ

에게 상황화 할 필요가 없습니다 보여줍니다 여기에 두 가지 간단한 예입니다

보고 [업데이트 된 후 업데이트 됨]

그리고 동적

http://www.sharexml.com/x/get?k=pBAwCds86RnQ

http://www.sharexml.com/x/get?k=JHEWghzgWIq1

희망을 그 문서 타입을 변경하려면이 응답에 대한 innovimax 감사합니다 @

+0

을하는 데 도움이됩니다. amd

요소에 대한 공개 및 시스템 식별자가 다릅니다. 우리는 단지 하나의 XProc 만 가질 수 있습니다. – suresh

+0

이제 고정되어야합니다 – innovimax

+0

@ inovimax. 고마워요. 문제가 해결되었습니다. – suresh

관련 문제