Любой способ проверить, предоставляется ли дополнительный элемент в macrodef?
Есть ли способ проверить, передан ли данный элемент X в макросе. У меня есть случай, чтобы решить, должен ли элемент X быть обязательным или необязательным. Чтобы добиться этого, я сделал элемент необязательным для всех случаев, но я хочу сделать проверку в случае, если элемент отсутствует, если его можно пропустить:-).
Макрос выглядит так:
<macrodef name="test">
<attribute name="attribute1"/>
......
<attribute name="attributeN/>
<element name="X" optional="true/>
<element name="Y" optional="true/>
<sequential>
<local>
<!--here check if the element <X/> is passed -->
</local>
</sequential>
</macrodef>
<test attribute1="1", attributeN="N">
<!--Here do not provide element X. Only provide Y-->
<Y>
<nestedY1>Some text1</nestedY1>
<nestedY2>Some text2</nestedY2>
</Y>
</test>
Элемент X выглядит точно так же, как элемент Y. Я имею в виду, если он присутствует, он будет содержать другие вложенные элементы.
Может быть, я ошибаюсь в том, как я понимаю эту концепцию. Я постараюсь привести еще один пример. В настоящее время элемент X является обязательным, и моя задача - сделать его необязательным в некоторых случаях, но обязательным в других случаях. Я хочу иметь возможность использовать макрос в обоих направлениях, но я не знаю, как реализовать эту задачу:
<macrodef name="test">
<attribute name="attribute1"/>
<element name="X"/>
<element name="MandatoryX" optional="true/>
<sequential>
<local>
<!--here check if the element <MandatoryX/> is passed and if Yes than make sure that element X is passed too-->
</local>
</sequential>
</macrodef>
<test attribute1="1">
<!--Here MandatoryX is missing and X can be missing too-->
</test>
or
<test attribute1="1">
<MandatoryX>In case MandatoryX is present, than element X must be present too</MandatoryX>
<X>Here X is mandatory</X>
</test>
1 ответ
Я придумал, как это сделать. Немного неуклюжий, но у меня работает. Ключ в том, чтобы использовать
<echoxml>
задача записать макроэлемент в файл, затем прочитать файл и найти в нем какой-то шаблон. я пишу
<stuff>
а также
</stuff>
вокруг макроэлемента. Если макроэлемент не указан,
stuff
элемент записывается просто
<stuff />
, и это можно искать.
Обратите внимание: я также использую antcontrib, поэтому
<if>
блокировать.
<macrodef name="processFiles">
<attribute name="workDir"/>
<attribute name="tempDir"/>
<element name="extra-deletes" optional="true"/>
<sequential>
<echoxml file="@{tempDir}/extra-deletes.xml"><stuff><extra-deletes/></stuff></echoxml>
<local name="extra-deletes-prop"/>
<loadfile property="extra-deletes-prop" srcfile="@{tempDir}/extra-deletes.xml"/>
<if>
<not><contains string="${extra-deletes-prop}" substring="<stuff />"/></not>
<then>
<delete>
<fileset dir="@{workDir}">
<extra-deletes/>
</fileset>
</delete>
</then>
</if>
</sequential>
</macrodef>
Этот макрос будет вызываться с некоторым выражением, включающим
<filename .../>
чтобы определить, какие файлы нужно удалить. (Это получено из более сложного сценария, но в основном существует некоторый шаблон файлов для удаления для каждого проекта, а в других проектах есть дополнительные шаблоны удаления для конкретного проекта.)
Итак, это будет называться так:
<processFiles workDir="..." tempDir="...">
<extra-deletes>
<or>
<filename name="..."/>
<filename regex="..."/>
</or>
</extra-deletes>
</processFiles>
... или в случае отсутствия дополнительных удалений, которые нужно выполнить,
<processFiles workDir="..." tempDir="..."/>