Любой способ проверить, предоставляется ли дополнительный элемент в 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="&lt;stuff /&gt;"/></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="..."/>
Другие вопросы по тегам