Получить значение в элементе Ant

Допустим, у меня есть макроопределение, как так

<macrodef name="Test">
    <element name="someName"/>
    <sequential>
        <java classname="path_to_Test">
            <classpath> blah </classpath>
            <arg value="someText and {valueOfsomeName}"/>
        </java>
    </sequential>
</macrodef>

Затем, ниже, у меня есть цель, которая использует этот макрос, как

<target name="testMacrodef">
    <Test>
        <someName value="someValue"/>
    </Test>
</target>

Мой вопрос, как я могу получить {valueOfsomeName} быть точно строкой someValue? Я не могу заставить его работать вообще.

Кроме того, просто для небольшого контекста, я не могу просто использовать тег атрибута вместо тега элемента, так как мне нужно, чтобы он был необязательным аргументом.

Я гуглил целую вечность, пытаясь найти решение для этого; возможно нет ни одного. Но, насколько я вижу, никто не спрашивал об этом, и, похоже, это не очень хорошо освещено в документации по Ant, поэтому, если это невозможно, есть ли способ иметь необязательный атрибут?

РЕДАКТИРОВАТЬ: правописание

2 ответа

Решение

Используйте простое эхо, если элемент имеет только текстовое содержимое, например:

<macrodef name="Test">
 <element name="someName" optional="yes"/>
 <attribute name="foo" default="bar"/>
  <sequential>
   <echo>
    <someName/>
   </echo>
   <echo> @@{foo} => @{foo}</echo>
  </sequential>
</macrodef>

<Test>
 <someName>blablabla..</someName>
</Test>

выход:

[echo]     
[echo]    blablabla..
[echo]  @{foo} => bar

в противном случае для вложенного содержимого XML используйте echoxml, например:

<macrodef name="Test">
 <element name="someName" optional="yes"/>
 <attribute name="foo" default="bar"/>
  <sequential>
   <echoxml>
    <someName/>
   </echoxml>
   <echo> @@{foo} => @{foo}</echo>
  </sequential>
</macrodef>

<Test>
 <someName>
  <echo>blablabla..</echo>
 </someName>
</Test>

выход:

<?xml version="1.0" encoding="UTF-8"?>
<echo>blablabla..</echo>
[echo]  @{foo} => bar

Если вам нужны значения элемента для дальнейшей обработки, используйте echo / echoxml для файла и впоследствии загрузите файл.
--EDIT после комментария -
Эхо в файл:

<macrodef name="Test">
 <element name="someName" optional="yes"/>
 <attribute name="foo" default="bar"/>
  <sequential>
   <echo file="somefile.txt">
    <someName/>
   </echo>
   <echo> @@{foo} => @{foo}</echo>
  </sequential>

или же

<macrodef name="Test">
 <element name="someName" optional="yes"/>
 <attribute name="foo" default="bar"/>
  <sequential>
   <echoxml file="somefile.txt">
    <someName/>
   </echoxml>
   <echo> @@{foo} => @{foo}</echo>
  </sequential>

и использовать loadfile after = = создает свойство (= string) с контентом.
При использовании echoxml strip заголовка xml с filterchain:

<loadfile srcfile=" ... " property="whatever">
 <filterchain>
  <headfilter lines="10" skip="1"/>
 </filterchain>
</loadfile>

Адаптируйте значение атрибута линий headfilter к вашим потребностям.
Свойство все равно будет иметь значение:

<echo>blablabla..</echo>

Я всегда делаю что-то вроде этого:

<macrodef name="test">
    <attribute name="foo"/>
    <sequential>
        <echo message="@{foo}"></echo>
    </sequential>
</macrodef>

<target name="so">
    <test foo="Hello SO." />
</target>

Надеюсь это поможет.

Другие вопросы по тегам