C
HAPTER
13: XML Rules
XML Rules Examples     201
InDesign does include a series of errors specific to XML-rules processing. An InDesign error can occur at 
XML-rules processor initialization, when a rule uses a non-conforming XPath specifier (see “XPath 
limitations” on page 200
). An InDesign error also can be caused by a model change that invalidates the 
state of an XML-rules processor. XML structure changes caused by the operation of XML rules can 
invalidate the XML-rules processor. These changes to the XML structure can be caused by the script 
containing the XML-rules processor, another concurrently executing script, or a user action initiated from 
the user interface.
XML structure changes that invalidate an XML-rules processor lead to errors when the XML-rules 
processor's iteration resumes. The error message indicates which XML structural change caused the error. 
XML rules flow of control
As a script containing XML rules executes, the flow of control passes from the script function containing 
the XML rules to each XML rule, and from each rule to the functions defined in the glue code. Those 
functions pass control to the XML-rules processor which, in turn, iterates through the XML elements in the 
structure. Results and errors are passed back up the chain until they are handled by a function or cause a 
scripting error. The following diagram provides a simplified overview of the flow of control in an XML-rules 
script:
XML Rules Examples
Because XML rules rely on XPath statements to find qualifying XML elements, XML rules are closely tied to 
the structure of the XML in a document. This means it is almost impossible to demonstrate a functional 
XML-rules script without having an XML structure to test it against. In the remainder of this chapter, we 
present a series of XML-rules exercises based on a sample XML data file. For our example, we use the 
product list of an imaginary integrated-circuit manufacturer. Each record in the XML data file has the 
following structure:
XML rules script
glue code
XML rule
processor
XML rule
__processRuleSet
__processChildren
__skipChildren
XPath condition
apply()
XPath
evaluation
XML structure
iteration
XPath condition
XML element
XMLelement
XMLelement
XMLrules
Program convert pdf to tiff - Library software component:C# PDF Convert to Tiff SDK: Convert PDF to tiff images in C#.net, ASP.NET MVC, Ajax, WinForms, WPF
Online C# Tutorial for How to Convert PDF File to Tiff Image File
www.rasteredge.com
Program convert pdf to tiff - Library software component:VB.NET PDF Convert to Tiff SDK: Convert PDF to tiff images in vb.net, ASP.NET MVC, Ajax, WinForms, WPF
Free VB.NET Guide to Render and Convert PDF Document to TIFF
www.rasteredge.com
C
HAPTER
13: XML Rules
XML Rules Examples     202
<device>
<name></name>
<type></type>
<part_number></part_number>
<supply_voltage>
<minimum></minimum>
<maximum></maximum>
</supply_voltage>
<package>
<type></type>
<pins></pins>
</package>
<price></price>
<description></description>
</device>
The scripts are presented in order of complexity, starting with a very simple script and building toward 
more complex operations.
Setting up a sample document
Before you run each script in this chapter, import the 
XMLRulesExampleData.xml
data file into a 
document. When you import the XML, turn on the Do Not Import Contents of Whitespace-Only Elements 
option in the XML Import Options dialog box. Save the file, then choose File > Revert before running each 
sample script in this section. Alternately, run the following script before you run each sample XML-rule 
script (see the 
XMLRulesExampleSetup.jsx
script file):
//XMLRuleExampleSetup.jsx
//
main();
function main(){
var myDocument = app.documents.add();
myDocument.xmlImportPreferences.allowTransform = false;
myDocument.xmlImportPreferences.ignoreWhitespace = true;
var myScriptPath = myGetScriptPath();
var myFilePath = myScriptPath.path + "/XMLRulesExampleData.xml"
myDocument.importXML(File(myFilePath));
var myBounds = myGetBounds(myDocument, myDocument.pages.item(0));
myDocument.xmlElements.item(0).placeIntoFrame(myDocument.pages.item(0), myBounds);
function myGetBounds(myDocument, myPage){
var myWidth = myDocument.documentPreferences.pageWidth;
var myHeight = myDocument.documentPreferences.pageHeight;
var myX1 = myPage.marginPreferences.left;
var myY1 = myPage.marginPreferences.top;
var myX2 = myWidth - myPage.marginPreferences.right;
var myY2 = myHeight - myPage.marginPreferences.bottom;
return [myY1, myX1, myY2, myX2];
}
function myGetScriptPath() {
try {
return app.activeScript;
}
catch(myError){
return File(myError.fileName);
}
}
}
Library software component:VB.NET PDF - WPF PDF Viewer for VB.NET Program
VB.NET PDF - WPF PDF Viewer for VB.NET Program. Online Guide for Using RasterEdge WPF PDF Viewer to View, Annotate, Convert and Print PDF in VB.NET Project.
www.rasteredge.com
Library software component:VB.NET PDF Convert to Jpeg SDK: Convert PDF to JPEG images in vb.
Change converted image size in Visual Basic program. Able to convert password protected PDF document. Source codes for quick integration in VB.NET class.
www.rasteredge.com
C
HAPTER
13: XML Rules
XML Rules Examples     203
Getting started with XML rules
Here is a very simple XML rule—it does nothing more than add a return character after every XML element 
in the document. The XML-rule set contains one rule. For the complete script, see AddReturns.
global myGlueCode
on run
tell application "Adobe InDesign CS5"
set myRootXML to first XML element of document 1
set myApplicationPath to file path
set myFilePath to file path as string
set myFilePath to myFilePath & "Scripts:Xml rules:glue code.scpt"
set myGlueCode to load script file myFilePath
set myRuleSet to {my AddReturns()}
end tell
tell myGlueCode
--The third parameter of __processRuleSet is a
--prefix mapping table; we'll leave it empty.
__processRuleSet(myRootXML, myRuleSet, {})
end tell
end run
to AddReturns()
script AddReturns
property name : "AddReturns"
property xpath : "//*"
on apply(myXMLElement, myRuleProcessor)
global myReturnString
set myReturnString to "OK"
tell application "Adobe InDesign CS5"
try
tell myXMLElement
insert text as content using return position element end
end tell
on error myError
set myReturnString to myError
end try
end tell
return false
end apply
end script
end AddReturns
Adding white space and static text
The following XML rule script is similar to the previous script, in that it adds white space and static text. It is 
somewhat more complex, however, in that it treats some XML elements differently based on their element 
names. For the complete script, see AddReturnsAndStaticText.
Library software component:C# Create PDF from Tiff Library to convert tif images to PDF in C#
Program.RootPath + "\\" Output.pdf"; // Load a TIFF file. TIFFDocument doc = new TIFFDocument(inputFilePath); // Convert loaded TIFF file to PDF document.
www.rasteredge.com
Library software component:C# Create PDF from images Library to convert Jpeg, png images to
String outputFilePath = Program.RootPath + "\\output.pdf"; doc.Save(outputFilePath); C# Example: Convert More than Two Type Images to PDF in C#.NET
www.rasteredge.com
C
HAPTER
13: XML Rules
XML Rules Examples     204
global myGlueCode
on run
tell application "Adobe InDesign CS5"
set myRootXML to first XML element of document 1
set myApplicationPath to file path
set myFilePath to file path as string
set myFilePath to myFilePath & "Scripts:Xml rules:glue code.scpt"
set myGlueCode to load script file myFilePath
set myRuleSet to {my ProcessDevice(), my ProcessName(), my ProcessType(), my 
ProcessPartNumber(), my ProcessSupplyVoltage(), my ProcessPackageType(), my 
ProcessPackageOne(), my ProcessPackages(), my ProcessPrice()}
end tell
tell myGlueCode
--The third parameter of __processRuleSet is a
--prefix mapping table; we'll leave it empty.
__processRuleSet(myRootXML, myRuleSet, {})
end tell
end run
to ProcessDevice()
script ProcessDevice
property name : "ProcessDevice"
property xpath : "/devices/device"
on apply(myXMLElement, myRuleProcessor)
global myReturnString
set myReturnString to "OK"
tell application "Adobe InDesign CS5"
try
tell myXMLElement
insert text as content using return position after element
end tell
on error myError
set myReturnString to myError
end try
end tell
return true
end apply
end script
end ProcessDevice
to ProcessName()
script ProcessName
property name : "ProcessName"
property xpath : "/devices/device/name"
on apply(myXMLElement, myRuleProcessor)
global myReturnString
set myReturnString to "OK"
tell application "Adobe InDesign CS5"
try
tell myXMLElement
insert text as content using "Device Name: " position 
before element
insert text as content using return position after element
end tell
on error myError
set myReturnString to myError
end try
end tell
return true
end apply
end script
end ProcessName
Library software component:C# PDF Convert to Jpeg SDK: Convert PDF to JPEG images in C#.net
PDFPage page = (PDFPage)doc.GetPage(0); // Convert the first PDF page to a JPEG file. page.ConvertToImage(ImageType.JPEG, Program.RootPath + "\\Output.jpg");
www.rasteredge.com
Library software component:C# PDF Convert to Word SDK: Convert PDF to Word library in C#.net
String inputFilePath = Program.RootPath + "\\" 1.pdf"; PDFDocument doc = new Description: Convert to DOCX/TIFF and save it on the disk. Parameters:
www.rasteredge.com
C
HAPTER
13: XML Rules
XML Rules Examples     205
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"
try
tell myXMLElement
insert text as content using "Circuit Type: " position 
before element
insert text as content using return position after element
end tell
on error myError
set myReturnString to myError
end try
end tell
return true
end apply
end script
end ProcessType
to ProcessPartNumber()
script ProcessPartNumber
property name : "ProcessPartNumber"
property xpath : "/devices/device/part_number"
on apply(myXMLElement, myRuleProcessor)
global myReturnString
set myReturnString to "OK"
tell application "Adobe InDesign CS5"
try
tell myXMLElement
insert text as content using "Part Number: " position before 
element
insert text as content using return position after element
end tell
on error myError
set myReturnString to myError
end try
end tell
return true
end apply
end script
end ProcessPartNumber
to ProcessSupplyVoltage()
script ProcessSupplyVoltage
property name : "ProcessSupplyVoltage"
property xpath : "/devices/device/supply_voltage"
on apply(myXMLElement, myRuleProcessor)
global myReturnString
set myReturnString to "OK"
tell application "Adobe InDesign CS5"
try
tell myXMLElement
insert text as content using "Supply Voltage: From: "
position before element
insert text as content using return position after element
tell XML element 1
insert text as content using " to " position after
element
Library software component:C# PDF Convert to Images SDK: Convert PDF to png, gif images in C#
PDFPage page = (PDFPage)doc.GetPage(0); // Convert the first PDF page to a PNG file. page.ConvertToImage(ImageType.PNG, Program.RootPath + "Output.png");
www.rasteredge.com
Library software component:VB.NET PDF Password Library: add, remove, edit PDF file password
Dim intputFilePath As String = Program.RootPath + "\\" 1.pdf" Dim outputFilePath As String = Program.RootPath + "\\" 1_with_pw.pdf" ' Set passwords for
www.rasteredge.com
C
HAPTER
13: XML Rules
XML Rules Examples     206
end tell
tell XML element -1
insert text as content using " volts" position after 
element
end tell
end tell
on error myError
set myReturnString to myError
end try
end tell
return true
end apply
end script
end ProcessSupplyVoltage
to ProcessPackageType()
script ProcessPackageType
property name : "ProcessPackageType"
property xpath : "/devices/device/package/type"
on apply(myXMLElement, myRuleProcessor)
global myReturnString
set myReturnString to "OK"
tell application "Adobe InDesign CS5"
try
tell myXMLElement
insert text as content using "-" position after element
end tell
on error myError
set myReturnString to myError
end try
end tell
return true
end apply
end script
end ProcessPackageType
--Add the text "Package:" before the list of packages.
to ProcessPackageOne()
script ProcessPackageOne
property name : "ProcessPackageOne"
property xpath : "/devices/device/package[1]"
on apply(myXMLElement, myRuleProcessor)
global myReturnString
set myReturnString to "OK"
tell application "Adobe InDesign CS5"
try
tell myXMLElement
insert text as content using "Package: " position before 
element
end tell
on error myError
set myReturnString to myError
end try
end tell
return true
end apply
end script
end ProcessPackageOne
--Add commas between the package types and a return at the end of the packages.
to ProcessPackages()
script ProcessPackages
property name : "ProcessPackages"
C
HAPTER
13: XML Rules
XML Rules Examples     207
property xpath : "/devices/device/package"
on apply(myXMLElement, myRuleProcessor)
global myReturnString
set myReturnString to "OK"
tell application "Adobe InDesign CS5"
try
tell myXMLElement
set myIndex to index of myXMLElement
if myIndex is not 1 then
insert text as content using ", " position before element
end if
end tell
on error myError
set myReturnString to myError
end try
end tell
return true
end apply
end script
end ProcessPackages
to ProcessPrice()
script ProcessPrice
property name : "ProcessPrice"
property xpath : "/devices/device/price"
on apply(myXMLElement, myRuleProcessor)
global myReturnString
set myReturnString to "OK"
tell application "Adobe InDesign CS5"
try
tell myXMLElement
insert text as content using return position before element
insert text as content using "Price: $" position 
before element
insert text as content using return position after element
end tell
on error myError
set myReturnString to myError
end try
end tell
return true
end apply
end script
end ProcessPrice
N
OTE
: The above script uses scripting logic to add commas between repeating elements (in the 
ProcessPackages
XML rule). If you have a sequence of similar elements at the same level, you can use 
forward-axis matching to do the same thing. Given the following example XML structure:
<xmlElement><item>1</item><item>2</item><item>3</item><item>4</item>
</xmlElement>
To add commas between each 
item
XML element in a layout, you could use an XML rule like the 
following (from the ListProcessing tutorial script):
C
HAPTER
13: XML Rules
XML Rules Examples     208
global myGlueCode
on run
tell application "Adobe InDesign CS5"
set myRootXML to first XML element of document 1
set myApplicationPath to file path
set myFilePath to file path as string
set myFilePath to myFilePath & "Scripts:Xml rules:glue code.scpt"
set myGlueCode to load script file myFilePath
set myRuleSet to {my ListItems()}
end tell
tell myGlueCode
__processRuleSet(myRootXML, myRuleSet, {})
end tell
end run
to ListItems()
script ListItems
property name : "ListItems"
property xpath : "/xmlElement/item[1]/following-sibling::*"
on apply(myXMLElement, myRuleProcessor)
tell application "Adobe InDesign CS5"
tell myXMLElement
insert text as content using ", " position before element
end tell
end tell
return false
end apply
end script
end ListItems
Changing the XML structure using XML rules
Because the order of XML elements is significant in InDesign’s XML implementation, you might need to 
use XML rules to change the sequence of elements in the structure. In general, large-scale changes to the 
structure of an XML document are best done using an XSLT file to transform the document before or 
during XML import into InDesign.
The following XML rule script shows how to use the 
move
method to accomplish this. Note the use of the 
__skipChildren
function from the glue code to prevent the XML-rules processor from becoming invalid. 
For the complete script, see MoveXMLElement.
global myGlueCode
on run
tell application "Adobe InDesign CS5"
set myRootXML to first XML element of document 1
set myApplicationPath to file path
set myFilePath to file path as string
set myFilePath to myFilePath & "Scripts:Xml rules:glue code.scpt"
set myGlueCode to load script file myFilePath
set myRuleSet to {my MoveElement()}
end tell
tell myGlueCode
--The third parameter of __processRuleSet is a
--prefix mapping table; we'll leave it empty.
__processRuleSet(myRootXML, myRuleSet, {})
end tell
end run
to MoveElement()
script MoveElement
C
HAPTER
13: XML Rules
XML Rules Examples     209
property name : "MoveElement"
property xpath : "/devices/device/part_number"
on apply(myXMLElement, myRuleProcessor)
tell myGlueCode
__skipChildren(myRuleProcessor)
end tell
global myReturnString
set myReturnString to "OK"
tell application "Adobe InDesign CS5"
try
tell myXMLElement
set myParent to parent
set myTargetXMLElement to XML element 1 of myParent
move to before myTargetXMLElement
end tell
on error myError
set myReturnString to myError
end try
end tell
return true
end apply
end script
end MoveElement
Duplicating XML elements with XML rules
As discussed in Chapter12, “XML
,”
XML elements have a one-to-one relationship with their expression in a 
layout. If you want the content of an XML element to appear more than once in a layout, you need to 
duplicate the element. The following script shows how to duplicate elements using XML rules. For the 
complete script, see DuplicateXMLElement. Again, this rule uses 
__skipChildren
to avoid invalid XML 
object references.
global myGlueCode
on run
tell application "Adobe InDesign CS5"
set myRootXML to first XML element of document 1
set myApplicationPath to file path
set myFilePath to file path as string
set myFilePath to myFilePath & "Scripts:Xml rules:glue code.scpt"
set myGlueCode to load script file myFilePath
set myRuleSet to {my DuplicateElement()}
end tell
tell myGlueCode
--The third parameter of __processRuleSet is a
--prefix mapping table; we'll leave it empty.
__processRuleSet(myRootXML, myRuleSet, {})
end tell
end run
to DuplicateElement()
script DuplicateElement
property name : "DuplicateElement"
property xpath : "/devices/device/part_number"
on apply(myXMLElement, myRuleProcessor)
--Because this rule makes changes to the XML structure,
--you must use __skipChildren to avoid invalidating
--the XML object references.
tell myGlueCode
__skipChildren(myRuleProcessor)
C
HAPTER
13: XML Rules
XML Rules Examples     210
end tell
global myReturnString
set myReturnString to "OK"
tell application "Adobe InDesign CS5"
try
tell myXMLElement
duplicate
end tell
on error myError
set myReturnString to myError
end try
end tell
return true
end apply
end script
end DuplicateElement
XML rules and XML attributes
The following XML rule adds attributes to XML elements based on the content of their “name” element. 
When you need to find an element by its text contents, copying or moving XML element contents to XML 
attributes attached to their parent XML element can be very useful in XML-rule scripting. While the subset 
of XPath supported by XML rules cannot search the text of an element, it can find elements by a specified 
attribute value. For the complete script, see AddAttribute.
global myGlueCode
on run
tell application "Adobe InDesign CS5"
set myRootXML to first XML element of document 1
set myApplicationPath to file path
set myFilePath to file path as string
set myFilePath to myFilePath & "Scripts:Xml rules:glue code.scpt"
set myGlueCode to load script file myFilePath
set myRuleSet to {my AddAttribute()}
end tell
tell myGlueCode
__processRuleSet(myRootXML, myRuleSet, {})
end tell
end run
to AddAttribute()
script AddAttribute
property name : "AddAttribute"
property xpath : "/devices/device/part_number"
--Adds the content of an XML element to an attribute of
--the parent of the XML element. This can make finding the
--element by its contnet much easier and faster.
on apply(myXMLElement, myRuleProcessor)
global myReturnString
set myReturnString to "OK"
tell application "Adobe InDesign CS5"
try
Documents you may be interested
Documents you may be interested