2012-07-31 67 views
0



我導入XML到InDesign,我得到這個消息:InDesign CS5腳本:如何在導入XML時忽略DTD?

The external entity 'blahblah.dtd' cannot be found. Continue to import anyway?

當我再繼續導入XML,我得到這個錯誤信息:

Javascript Error!

Error Number: 103237 Error String: DOM transformation error: Invalid namespace.

Engine: session File: C:\blahblah\blahblah.jsx Line: 259 Source:
obj.doc.importXML(File(xmlDoc));

..問題是,我無法訪問DTD,無論如何我都不需要它。


  • 那麼,有沒有一個Extendscript辦法忽略的DTD?
  • 如果沒有,是否有一種方法可以用XSLT忽略DTD?



下面是相關代碼:

function importXML(xmlDoc, xslt) 
{ 
    with(obj.doc.xmlImportPreferences) 
    { 
     importStyle = XMLImportStyles.MERGE_IMPORT; // merges XML elements into the InDesign document, merging with whatever matching content 
     createLinkToXML = true; // link elements to the XML source, instead of embedding the XML 

     // defining the XSL transformation settings here 
     allowTransform = true; // allows XSL transformation 
     transformFilename = File(xslt); // applying the XSL here 

     repeatTextElements = true; // repeating text elements inherit the formatting applied to placeholder text, **only when import style is merge! 
     ignoreWhitespace = true; // gets rid of whitespace-only text-nodes, and NOT whitespace in Strings 
     ignoreComments = true; 
     ignoreUnmatchedIncoming = true; // ignores elements that do not match the existing structure, **only when import style is merge! 
     importCALSTables = true; // imports CALS tables as InDesign tables 
     importTextIntoTables = true; // imports text into tables if tags match placeholder tables and their cells, **only when import style is merge! 
     importToSelected = false; // import the XML at the root element 
     removeUnmatchedExisting = false; 
    } 

    obj.doc.importXML(File(xmlDoc)); 
    obj.doc.mapXMLTagsToStyles(); // automatically match all tags to styles by name (after XSL transformation) 

    alert("The XML file " + xmlDoc.name + " has been successfully imported!"); 

} // end of function importXML 

...這是基於頁。 407(第18章)InDesign CS5 Automation Using XML & Javascript,Grant Gamble

+0

您是否嘗試過使用xslt修改xml以刪除對dtd的引用? – zanegray 2012-07-31 19:10:09

+0

謝謝@zanegray,這似乎是最好的方法...我正在嘗試''with' ',但它顯示出這個錯誤:'Token'!'沒有被識別。「# – 2012-07-31 19:15:42

+0

......我也試圖實施在http://www.stylusstudio.com/xsllist/200104/post90620.html找到的解決方案,但是也沒有工作。 – 2012-07-31 19:25:06

回答

1

好,甚至simplier。我們只需要防止交互,然後刪除附加的任何dtds:

function silentXMLImport(file) 
{ 
    var doc, oldInteractionPrefs = app.scriptPreferences.userInteractionLevel; 

    if (!(file instanceof File) || !file.exists) 
    { 
     alert("Problem with file : "+file); 
    } 

    if (app.documents.length == 0) 
    { 
     alert("Open a document first"); 
     return; 
    } 

    //Prevent interaction and warnings 
    app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT; 
    doc = app.activeDocument; 
    doc.importXML (file); 

    //Remove any dtd attached to the document 
    doc.dtds.everyItem().remove(); 

    app.scriptPreferences.userInteractionLevel = oldInteractionPrefs; 
} 

//Now import xml 
silentXMLImport (File (Folder.desktop+"/foobar.xml")); 

它在這裏工作。

+0

謝謝@Loic,問題解決了!我很好奇 - 是否可以像'doc.namespaceDeclarations()。everyItem()。remove()'或doc.removeNamespace(doc.namespaceDeclarations()。everyItem())一樣去除所有名稱空間。 ? – 2012-08-01 18:20:11

+0

不確定它可以這樣修復。無法看到有關命名空間的任何可訪問的屬性。 – Loic 2012-08-01 18:50:45

1

我認爲zanegray給了你主要的概念,儘管我認爲你過於複雜。 爲什麼不只是獲取xml文件內容,用正則表達式去除tetd dtd聲明,然後輸出一個新的XML文件,用於輸入?

//Open and retrieve original xml file content 
var originalXMLFile = File (Folder.desktop+"/foo.xml"); 
originalXMLFile.open('r'); 
var content = originalXMLFile.read(); 
//Looks for a DOCTYPE declaration and remove it 
content = content.replace (/\n<!DOCTYPE[^\]]+\]>/g , ""); 
originalXMLFile.close(); 
//Creates a new file without any DTD declaration 
var outputFile = new File (Folder.desktop+"/bar.xml"); 
outputFile.open('w'); 
outputFile.write(content); 
outputFile.close(); 

然後,您可以使用此過濾XML爲您的導入。

+0

這個正則表達式只會刪除一個帶有內部子集('[]')的doctype,並且在同一行結束。怎麼樣一個沒有內部子集的文檔類型?如何在一個跨越多行的內部子集中包含內容的文檔類型? (或者包含類似'<!ENTITY foo「[bar]」>'?我不認爲正則表達式是剝離doctypes的好主意(我過去做過類似的事情,雖然刪除了一切直到根元素(在doctype聲明中標識)。) – 2012-07-31 19:50:14

+0

@DevNull,你是完全正確的。你的XSL很棒。 – Loic 2012-07-31 20:25:27

+0

謝謝@Loic!嗯,這會保持與原始XML文檔的鏈接嗎?有需要的原始鏈接,以便對XML的任何更改會自動更新InDesign文檔... – 2012-07-31 20:38:27

1

這裏是一個XSLT將剝離DOCTYPE聲明:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <xsl:copy-of select="."/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

謝謝@DevNull,但是,這不工作...我使用這個基本的XML測試這個在http://www.w3schools.com/XSL/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog_ex2:'<?xml version =「1.0」encoding =「 utf-8「?><!DOCTYPE文章SYSTEM」blahblah.dtd「>'。 – 2012-07-31 21:17:50

+1

@IanCampbell - 我認爲它不工作,因爲w3schools工具試圖顯示HTML輸出。嘗試不同的處理器。另一個可以嘗試的在線工具是XML Playground。試試這個保存的會話:http://www.xmlplayground.com/84o19w(不要忘記點擊「查看源代碼」標籤查看實際輸出。) – 2012-08-01 02:59:24

+0

啊,@DevNull你是正確的 - 它*是*在http://xslt.online-toolz.com/tools/xslt-transformation.php以及您提供的鏈接中工作。然而,它是*不*工作在InDesign不幸的.. – 2012-08-01 03:28:22

相關問題