요구는 :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">
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook Chap XML V4.5//EN" "chap.dtd">
</xsl:text>
</xsl:when>
<xsl:when test="/section">
<xsl:text disable-output-escaping="yes">
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook Sec XML V4.5//EN" "sec.dtd">
</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>
을하는 데 도움이됩니다. amd 요소에 대한 공개 및 시스템 식별자가 다릅니다. 우리는 단지 하나의 XProc 만 가질 수 있습니다. –
suresh
이제 고정되어야합니다 – innovimax
@ inovimax. 고마워요. 문제가 해결되었습니다. – suresh