user1971419
user1971419

Reputation:

Linking XML elements to page items in InDesign

I can check the XML of selected text like this:

app.selection[0].associatedXMLElements[0];

But in my research, I am still left scratching my head about how to do the most basic thing with XML using script: how do I assign XML to items? I can manually do this by opening the structure pane, then dragging the element over the desired frame on the page. If it's possible the old fashioned way, I imagine it's possible with script.

Upvotes: 1

Views: 2120

Answers (2)

Loic
Loic

Reputation: 2193

there are two specific properties. AssociatedXMLElement is for pageItems including textFrames and may be null if no tag is applied. AssociatedXMLElements only applies to text objects (characters, words…) because they can have several tags applied. Note that a non tagged text return an empty array and not null.

Associating tags to pageItems require that you first create or target existing xmlElements then use myInDesignObject.markup ( myXMLElement ).

EvaluateXPathExpression as Nicolai suggested is interesting once you want to browse through your XML structure. But it's sometimes quicker indeed to investigate associated XMLElement from the object rather than investigating the xml structure.

FWIW

Upvotes: 1

Nicolai Kant
Nicolai Kant

Reputation: 1391

You can reference your xml node and your text frame and use placeXML

    myXMl = myDoc.xmlElements[0];

    var myXmlNode = myXMl.evaluateXPathExpression("/myXML/node1")[0];

    var myFrame =  app.activeDocument.pages[0].textFrames[0];

    myXmlNode.placeXML(myFrame);

The advantage of this approach is that any aid:pstyle or aid:cstyle will be linked to existing matching style automaticaly

The alternative is to select the value of the node as text and place it into the text frame at insertion point:

 myXMl = myDoc.xmlElements[0];

 var myText = myXMl.xpath("/myXML/node1[1]/text()");

 var myFrame =  app.activeDocument.pages[0].textFrames[0];

 myFrame.parentStory.insertionPoints[-1].contents = myText + '\r';

Upvotes: 1

Related Questions