Я отвечу на свой вопрос. Возможно, у кого-то есть более элегантное решение. Еще раз, мы пытаемся получить как тег привязки, так и URL в переменную s: set. Проблем было две: 1) получение s: установить обработку строки тега как буквальной строки, а не объекта (который он хочет получить из ActionContext или где-то еще), и 2) отключение экранирования, чтобы текст строки привязки тег не преобразуется в htmlentities, как '& lt;'.
Для 1 я устанавливаю переменную равной null, но предоставляю аргумент по умолчанию, который s: property всегда обрабатывает как буквенную строку.
Для # 2 это просто вопрос использования escape = "false" в нужных местах.
К сожалению, строка должна состоять из отдельных битов свойства s: но что вы можете сделать?
<s:set name="composerName" >
<s:property value="" default="<a href=" escape="false"/>
<s:property value="" default="'" />
<s:property value="%{viewRecordURL}" escape="true"/>
<s:property value="" default="'>" escape="false" />
<s:property value="#composer.title" />
<s:property value="#composer.firstName" />
<s:property value="#composer.lastName" />
<s:property value="" default="</a>" escape="false"/>
</s:set>
Я еще не тестировал его с символами UTF-8 или потенциально проблемными символами, такими как '&', апостроф или одинарные кавычки в части #composer.