首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在XProc中动态生成文档类型声明?

如何在XProc中动态生成文档类型声明?
EN

Stack Overflow用户
提问于 2013-03-20 22:42:10
回答 1查看 365关注 0票数 2

要求:

  • 要在输出xml上添加正确的Doctype声明,则输入xml的根元素可以是章节元素或节元素。例如,假设章节元素公共标识符是公共的"-//OASIS//DTD DocBook CHACHXMLV4.5//EN“,而系统标识符是"chap.dtd”。公共标识符是公共的“//OASIS//DTD DocBook Sec XMLV4.5/EN”,系统标识符是"sec.dtd“。

输入XML1: chapter.xml

代码语言:javascript
运行
复制
<?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

代码语言:javascript
运行
复制
<?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:

样式表只是将输入xml复制到输出,并在所有部分元素上添加@sec,样式表为输出xml添加正确的doctype声明,因为输入xml根元素可以是或元素。

代码语言:javascript
运行
复制
<?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

代码语言:javascript
运行
复制
<?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.xml用于输入XML2

代码语言:javascript
运行
复制
<?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>

使用任何XSLT引擎,转换都能很好地工作,并且能够获得预期的输出。

但是,如果转换是通过XProc完成的,那么我将得到以下错误。有人能帮忙解决这个错误吗?

err: or 0001: XD0001如果在步骤输出上生成非XML资源或在步骤输入上到达,则为动态错误。

XProc文件: test.xpl

代码语言:javascript
运行
复制
<?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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-21 00:04:59

再看一看

以下是两个简单的示例,说明您不需要对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

希望这能有所帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15536190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档