On 07/14/2014 06:04 PM, Fabián Mandelbaum wrote:
I'm trying to write a macro command to remove all elements matching a
given XPath expression using XXE 5.9.0.
This is the command definition in my customization file (0docbook5.xxe):
<command name="db5.removeUnusedParts">
<macro repetable="true" undoable="true" label="Remove Unused Parts">
<sequence>
<command name="xpathSearch"
parameter="//*[@revisionflag='off']" />
<command name="delete" />
</sequence>
</macro>
</command>
I assign it to a button on the UI
<button toolTip="Remove Unused Parts"
icon="../config/common/icons/up.png">
<command name="db5.removeUnusedParts" />
</button>
The button shows up and it is enabled when I select an element in the
document. Clicking the button removes only the first matching node from
the XPath node-set result.
So, a few questions:
1) How can I have the button always enabled as opposed to enabled only
when selecting an element? The idea is to actually make this not a
button, but a menu entry of the "DocBook" (XML) menu.
Start the sequence with command "pass". See
http://www.xmlmind.com/xmleditor/_distrib/doc/commands/pass.html
2) If xpathSearch returns a node-set, why isn't the delete command
applied to all nodes in the node-set and it's only applied to the first
matching node?
The xpathSearch command does not return a node-set. It has been designed
to implement "Search|Find Element", which selects first found node
matching an XPath expression. See
http://www.xmlmind.com/xmleditor/_distrib/doc/help/com.xmlmind.xmledit.cmd.xsearch.XPathSearchDialog.html
The xpathSearch command is not really intended to be used in macros.
It's simpler and cleaner to use <set variable="selectedElement"
expression="..." />. See
http://www.xmlmind.com/xmleditor/_distrib/doc/commands/macro_reference.html
. See
http://www.xmlmind.com/xmleditor/_distrib/doc/commands/xpath_vars.html .
How can I 'loop' through all nodes returned in the
node-set applying the delete command on them?
Write a recursive macro-command. Not recommended though. See below.
Will I have to forget
about this macro command and write a custom Java command instead (Not
that I do not know how to do it, I'm just trying to solve this with what
XXE already has)?
Yes, when a macro-command becomes too complicated, it's always best to
rewrite it in Java.
All of the examples I've found on the documentation apply commands to a
single node, not to a node-set. I've searched the docs too and found no
"loop-like" construct to write commands (I'm pretty sure there's good
reasons for that... but I need one :-))
It's a design choice. Macro-commands were first designed to be very
simple. We have progressively made them more complex to increase their
power. May be macro-commands are now too sophisticated for their
intended use.
For now, we are reluctant to make them even more complex by adding
functions, for-loops, if/elseif/else, etc (though we have already these
``XPath++ constructs'' somewhere else; they are used to implement "Paste
From Word").
We are also reluctant to add JavaScript support to XMLmind XML Editor
because we fear that this would lead to a flurry of support requests.
--
XMLmind XML Editor Support List
[email protected]
http://www.xmlmind.com/mailman/listinfo/xmleditor-support