首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在合并多个xml文件时,除了父xml之外,如何为子xml文件设置EntityResolver?

在合并多个xml文件时,除了父xml之外,如何为子xml文件设置EntityResolver?
EN

Stack Overflow用户
提问于 2019-03-24 15:47:51
回答 2查看 218关注 0票数 0

我有一个图书xml文件,它引用了其他多个xml文件。当我试图在book.xml文件上运行xslt时,代码中的EntityResolver解析dtd路径。但是,对于正在合并的子xml文件,dtd路径未被解析。

样本sample_book.ditamap

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE bookmap PUBLIC "-//OASIS//DTD DITA BookMap//EN" "bookmap.dtd">
<bookmap>
    <booktitle>
        <mainbooktitle>sample book</mainbooktitle>
    </booktitle>
    <part navtitle="Overview">
        <topicref href="../topics/introduction.dita"/>
        <topicref href="../topics/install.dita"/>
    </part>
</bookmap>

`

Java代码

代码语言:javascript
复制
public class XMLProcessor  {

       public void transform(String xmlf, String xslf) throws TransformerConfigurationException, TransformerException, org.xml.sax.SAXException, IOException{

        org.xml.sax.XMLReader reader = XMLReaderFactory.createXMLReader();
        Transformer transformer;
        TransformerFactory factory = TransformerFactory.newInstance();

         StreamSource stylesheet = new StreamSource(xslf);

         //Source source = StreamSource(xmlf);
         //SAXSource source = new SAXSource(new InputSource(xmlf));
        // org.xml.sax.XMLReader reader = XMLReaderFactory.createXMLReader();

         EntityResolver ent = new EntityResolver() {

            @Override
            public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {

                System.out.println(publicId);
                System.out.println(systemId);

                if(publicId.equals("-//OASIS//DTD DITA BookMap//EN")){
                    return new InputSource("file:///D:/sample/dtd/bookmap.dtd");
                }

                return null;
                }
            };
        // sour.setPublicId("file:///D:/sample/dtd/bookmap/dtd/bookmap.dtd");


            reader.setEntityResolver(ent);
            SAXSource source = new SAXSource(reader, new InputSource(xmlf));
            //reader.parse(new InputSource(xmlf));
         //StreamSource sourcedoc = new StreamSource(xmlf);
         transformer = factory.newTransformer(stylesheet);

        try {
            transformer.transform(source, new StreamResult(new FileWriter("D:\\sample\\out\\result.xml")));
        } catch (IOException ex) {
            Logger.getLogger(XMLProcessor.class.getName()).log(Level.SEVERE, null, ex);
        }

    }





}`

预期结果

`

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<pages xmlns:mf="urn:mf">
    <parentpage>
        <parentpagename>sample book</parentpagename>
    </parentpage>
    <part>
        <partname>Overview</partname>
        <text/>
        <level-2>
            <concept xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/"
                id="introduction" ditaarch:DITAArchVersion="1.3"
                domains="(topic concept)                            (topic abbrev-d)                            a(props deliveryTarget)                            (topic equation-d)                            (topic hazard-d)                            (topic hi-d)                            (topic indexing-d)                            (topic markup-d)                            (topic mathml-d)                            (topic pr-d)                            (topic relmgmt-d)                            (topic sw-d)                            (topic svg-d)                            (topic ui-d)                            (topic ut-d)                            (topic markup-d xml-d)   "
                class="- topic/topic concept/concept ">
                <title class="- topic/title ">Introduction</title>
                <shortdesc class="- topic/shortdesc "/>
                <conbody class="- topic/body  concept/conbody ">
                    <p class="- topic/p ">Sample introduction</p>
                </conbody>
            </concept>
        </level-2>
        <text/>
        <level-2>
            <task xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/" id="install"
                ditaarch:DITAArchVersion="1.3"
                domains="(topic task)                            (topic abbrev-d)                            a(props deliveryTarget)                            (topic equation-d)                            (topic hazard-d)                            (topic hi-d)                            (topic indexing-d)                            (topic markup-d)                            (topic mathml-d)                            (topic pr-d)                            (topic relmgmt-d)                            (topic sw-d)                            (topic svg-d)                            (topic ui-d)                            (topic ut-d)                            (topic markup-d xml-d)                            (topic task strictTaskbody-c)   "
                class="- topic/topic task/task ">
                <title class="- topic/title ">Install</title>
                <shortdesc class="- topic/shortdesc "/>
                <taskbody class="- topic/body task/taskbody ">
                    <context class="- topic/section task/context ">
                        <p class="- topic/p ">Download xyz installer from here. </p>
                    </context>
                    <steps class="- topic/ol task/steps ">
                        <step class="- topic/li task/step ">
                            <cmd class="- topic/ph task/cmd ">Double-click the downloader
                                installer.</cmd>
                        </step>
                        <step class="- topic/li task/step ">
                            <cmd class="- topic/ph task/cmd ">Do this.</cmd>
                        </step>
                        <step class="- topic/li task/step ">
                            <cmd class="- topic/ph task/cmd ">Do that</cmd>
                        </step>
                    </steps>
                </taskbody>
            </task>
        </level-2>
    </part>
</pages>

`

实际效果

运行XSLT时,将显示以下错误消息。当我将dtd文件移到主题文件夹时,错误就消失了。

警告(file:///D:/sample/xsl/merge.xsl):对>XTDE0540的第54行中的/bookmap/booktitle 1的模糊规则匹配既匹配>XTDE0540第54行的"element(Q{}booktitle)“,而在第11行的第18行匹配”元素(q{}booktitle)“。 >merge.xsl: FODC0002: FODC0002: I/O错误,由XML解析器处理FODC0002 D:\sample\sampledoc\topics\concept.dtd (系统找不到 在xsl:apply中的char 11发出警告- >merge.xsl: FODC0002: FODC0002: I/O错误报告的第30行第104行的模板/@select(系统找不到指定的>文件)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-24 19:12:38

您可以在转换器上设置一个URIResolver,当您的XSLT代码调用doc()或document()来获取引用的XML文件时,它将被调用。然后,URIResolver可以在用于解析这些文件的EntityResolver解析器上设置一个EntityResolver。

或者,您可以使用Apache来完成所有这一切,通过引用OASIS定义的格式的目录文件来推断XMLResolver和XML级别的URI。

票数 1
EN

Stack Overflow用户

发布于 2019-03-25 09:19:24

多亏了迈克尔,我才能解决这个问题。

  1. 在类路径中添加了一个CatalogManager.properties文件。
  2. 创建一个具有所有公共ids的catalog.xml。 公共类XMLProcessor {公共空转换( String,String,String)抛出TransformerConfigurationException、TransformerException、org.xml.sax.SAXException、IOException{ org.xml.sax.XMLReader reader = XMLReaderFactory.createXMLReader();变压器=空;TransformerFactory工厂= TransformerFactory.newInstance();StreamSource样式表=新StreamSource( xslf );CatalogResolver cr =新CatalogResolver();reader.setEntityResolver(cr);factory.setURIResolver(cr);Logger.getLogger(XMLProcessor.class.getName()).log(Level.SEVERE,源=新SAXSource (读取器,新InputSource(xmlf));转换器=factory.newTransformer(样式表);尝试{transformer.transform(来源,新StreamResult(新路径));} catch (IOException ex) {SAXSource null,ex);}} }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55325569

复制
相关文章

相似问题

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