Kevin Flynn wrote:
> Hussein said:
> 
> 
>>I don't want to show off but what you need to do can be done much simply
>>by using the full power of XPath.
> 
> 
> You can show off as much as you like - I need all the help I can get :)
> 
> I've noticed that nobody else seems to need much help writing macros. I
> don't know whether this indicates that:
> 
> - nobody else is writing complex macros, or
> - lots of people are writing them, but they are all smarter than me.
> 
> It seems to me that that the threshold for writing macros is quite high: the
> mechanisms for handling conditions and passing parameters are unusual, and
> even when using the console functionality, you don't get a lot of feedback.
> I do a fair amount of XSL coding, but even so I don't find it easy using the
> XPath functionality in XXE.
> 
> I'm not proposing any changes to the macro functionality - I know that there
> are a lot of performance-related constraints involved, and I'm sure a lot of
> effort has gone into it. But it occurs to me that if there are other macro
> writers out there, then it might be an idea to pool our experience in the
> form of some kind of "macro library" containing useful snippets and examples
> of macro code.
> 
> To start the ball rolling, here is a "traverse" macro that will visit all of
> an element's descendant nodes. To use it you need to:
> 
>       - define a view namespace on the root configuration element by adding:
>               
> xmlns:view="http://www.xmlmind.com/xmleditor/namespace/scope/view";
>       - define two variables in the namespace ($view:current and 
> $view:original)
> and set them both to point to the element       whose subtree you want to
> traverse
>       - insert code where indicated to perform the required action on each
> visited node.
> 
>   <command name="traverse">
>     <macro>
>       <sequence>
>         <!-- an action performed on $view:current here will be performed on
> every node-->
>         <choice>
>           <sequence>
>             <match context="$view:current" pattern="node()[child::node()]"/>
>             <set context="$view:current" expression="./child::node()[1]"
> variable="view:current"></set>
>             <command name="traverse"/>
>           </sequence>
>           <sequence>
>             <!-- an action performed on $view:current here will only be
> performed on every 'leaf' node-->
>             <choice>
>               <sequence>
>                 <match context="$view:current"
> pattern="node()[following-sibling::node()]"/>
>                 <set context="$view:current"
> expression="./following-sibling::node()[1]" variable="view:current"></set>
>                 <command name="traverse"/>
>               </sequence>
>               <sequence>
>                 <test context="$view:current"
> expression="not(parent::node()=$view:original)"/>
>                   <choice>
>                     <sequence>
>                       <match context="$view:current/parent::node()"
> pattern="node()[following-sibling::node()]"/>
>                       <set context="$view:current/parent::node()"
> expression="./following-sibling::node()[1]" variable="view:current"></set>
>                       <command name="traverse"/>
>                     </sequence>
>                  </choice>
>               </sequence>
>             </choice>
>           </sequence>
>         </choice>
>       </sequence>
>     </macro>
>   </command>
> 
> I haven't tested it very thoroughly, but it seems to work so far. Any
> corrections/suggestions/improvements gratefully received.

Nobody is writing macros and you are clearly very smart (not kidding here).

*We*, XMLmind, are writing macros and this is sufficient to have 
invented them and to document them (in case they may be useful for other 
XXE users).

*Macros are not intended to be complex.* That's the key point. If a 
macro seems to be complex to write then it needs to be coded as a native 
Java command.

That is, the most typical macro is clearly:

---
   <command name="convertToBold">
     <macro>
       <sequence>
         <command name="convert"
                  parameter="[implicitElement] emphasis" />
         <command name="putAttribute" parameter="role bold" />
       </sequence>
     </macro>
   </command>
---



> Today's mail from Graham Heath suggests that there is some interest out
> there. It shouldn't be too hard to make a simple "search attributes" macro
> that would fill the gap until 3.0 comes along. Anybody want to do that?

If XXE lacks native commands to implement this macro-command, just tell 
us...



Reply via email to