C
HAPTER
13: XML Rules
Creating Tables using XML Rules 223
The “ProcessType” rule moves the “type” XML element to a new frame on the page: to ProcessType() script ProcessType property name : "ProcessType" property xpath : "/devices/device/type" on apply(myXMLElement, myRuleProcessor) global myReturnString set myReturnString to "OK" tell application "Adobe InDesign CS5" set myDocument to document 1 tell myDocument try tell myXMLElement insert text as content using "Circuit Type: " position before element insert text as content using return position after element apply paragraph style using "DeviceType" end tell set myPage to page -1 of myDocument set myBounds to my myGetBounds(myDocument, myPage) set myX1 to item 2 of myBounds set myY1 to (item 1 of myBounds) - 24 set myX2 to myX1 + 48 set myY2 to item 1 of myBounds set myTextFrame to place into frame myXMLElement on myPage geometric bounds {myY1, myX1, myY2, myX2} set fill color of myTextFrame to "Red" tell text frame preferences of myTextFrame set inset spacing to {6, 6, 6, 6} end tell on error myError set myReturnString to myError end try end tell end tell return true end apply end script end ProcessType
Creating Tables using XML Rules
You can use the convert element to table
method to turn an XML element into a table. This method has a limitation in that it assumes that all of the XML elements inside the table conform to a very specific set of XML tags—one tag for a row element; another for a cell, or column element. Typically, the XML data we want to put into a table does not conform to this structure: it is likely that the XML elements we want to arrange in columns use heterogeneous XML tags (price, part number, etc.).
To get around this limitation, we can “wrap” each XML element we want to add to a table row using a container XML element, as shown in the following script fragments (see XMLRulesTable). In this example, a specific XML rule creates an XML element for each row.
C
HAPTER
13: XML Rules
Creating Tables using XML Rules 224 to ProcessDevice() script ProcessDevice property name : "ProcessDevice" property xpath : "//device[@type = 'VCO']" on apply(myXMLElement, myRuleProcessor) global myReturnString set myReturnString to "OK" tell application "Adobe InDesign CS5" set myDocument to document 1 tell myDocument try set myContainerElement to XML element -1 of XML element -1 of XML element 1 tell myContainerElement set myNewElement to make XML element with properties
{markup tag:"Row"} end tell on error myError set myReturnString to myError end try end tell end tell return false end apply end script end ProcessDevice
Successive rules move and format their content into container elements inside the row XML element.
to ProcessPrice() script ProcessPrice property name : "ProcessPrice" property xpath : "//device[@type = 'VCO']/price" on apply(myXMLElement, myRuleProcessor) tell myGlueCode
__skipChildren(myRuleProcessor) end tell global myReturnString set myReturnString to "OK" tell application "Adobe InDesign CS5" set myDocument to document 1 tell myDocument try set myRootElement to XML element 1 set myVCOs to XML element -1 of myRootElement set myTable to XML element -1 of myVCOs set myContainerElement to XML element -1 of myTable tell myContainerElement set myNewElement to make XML element with properties
{markup tag:"Column"}