[Date Prev][Date Next] [Thread Prev][Thread Next]
[Date Index] [Thread Index] [New search]

Database-Style Queries in structured FM



The most fundamental advantage of structured documents is the ability to parse them into their constituent components for storage in a relational or object-oriented database, where complex queries can be issued to retrieve, and or modify, selected data.

But a structured FrameMaker document or book is also a searchable database which could be searched using queries similar to those used in a database.

Unfortunately, the Find/Change feature in structured FM offers only a very rudimentary query capability.

The Find capability is limited to:
+ Finding a specified element
+ Finding a specified attribute value in all elements where is appears
+ Finding the combination of a specified element and a specified attribute value.


The Change capability is limited to:
+ Changing found element names
+ Changing found attribute names
+ Changing found attribute values

Clearly, productivity could be greatly increased by substantially expanding the Find/Change capability.

What's needed is a FrameScript or FDK client which would expand the Find/Change capability to more closely emulate the the query capabilities available when a structured FM document is exported to SGML or XML and then stored in a database. For instance:

The Find and Change capability should be expanded to include scripted expressions such as:
================================================
FIND ((ElemName = "W") OR (ElemName= "X"))
EVALUATE (AttName = "Y")
IF (VALUE = "aaa") 0R (VALUE = "bbb")
SET VALUE (AttName "Z") TO "xxx"
ELSE
SET VALUE (AttName "Z") TO "yyy"
END
END
END
Where FIND, IF, ELSE, OR, AND, END, EVALUATE, SET, VALUE, TO, ElemName, and AttName are keywords in the expressions.


This script would find each instance of elements W and X in the file or book, evaluate attribute Y, and set the value of attribute Z accordingly in each found instance of element W or X.

The above expression would provide a viable solution to single-sourcing, where:

A. All W and X elements have attributes Y and Z.

B. AttName Y is a strings-type Effectivity attribute which lists all of the document versions in which an element's content is to be included.

C. Attname Z is a choice-type attribute having values of Show and Hide.

Execution of the script described above would set the value of the Show/Hide attribute in each found element to Show if any of the specified values of the Effectivity attribute were found, otherwise the Show/Hide attribute would be set to Hide.

Once the Show/Hide attribute is set to the proper value in all elements, the following expression would be executed to apply a Hide conditional text setting to all elements whose Show/Hide attribute is set to Hide:

EVALUATE (AttName "Show/Hide)
IF (VALUE = "Hide")
SET VALUE (CondText) TO "Hide"
END
END
Where EVALUATE, IF, SET, VALUE, TO, and CondText are expression keywords, and Hide is a predefined conditional text setting.
================================================
There are many other possibilities using this approach. For instance, it would be nice if you could search for cases where you want to find instances of an element when it is a nested child of a particular parent element, the following expression would be used:
===========================================
FIND (ElemName = "A") WITH (NestedChild = ElemName "B")


Where FIND, ElemName, WITH, and NestedChild are keywords in the expression.

This script would find every instance in which element B is a nested child of element A.

The syntax of these expressions is easy to grasp, even by those without programming experience.

I can envision a FrameScript or FDK client which, upon its invocation, would open a dialog box allowing the user to type in the appropriate script using the syntax described above. Upon clicking a Go button, FrameScript or the FDK client would check the script for errors, and, if the script is error-free, it would execute the script.



FrameMaker/FrameMaker+SGML Document Design & Database Publishing
DW Emory <danemory@xxxxxxxxxxxxxxxxxx>


** To unsubscribe, send a message to majordomo@xxxxxxxxx ** ** with "unsubscribe framers" (no quotes) in the body. **