2013-03-20 64 views
2

要求:如何在XProc中動態生成doctype聲明?

  • 是對輸出XML添加正確DOCTYPE聲明[輸入XML的根元素可以是章或節元件。對於實例,請考慮章節元素公共標識符是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來輸出,並增加了@sec上 樣式增加了正確DOCTYPE聲明來輸出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 XML1

<?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> 

預計爲輸入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> 
的Output.xml 210

使用任何XSLT引擎,改造工程精絕,並且能夠獲得期望的輸出

但是,如果轉換是通過XPROC做我結束了以下錯誤。 XD0001:在解決此錯誤

ERR人可以幫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

[在回答後更新]

如果你想要那個DOCTYPE變化動態

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

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

希望這有助於

+0

@ innovimax感謝您的答覆。請注意,我們有不同的公共和系統標識符

元素。我們可以只有一個XProc。 – suresh 2013-03-21 00:26:44

+0

現在應該修復 – innovimax 2013-03-21 08:11:38

+0

@ inovimax。非常感謝你。它解決了這個問題。 – suresh 2013-03-21 22:50:14