Docx4j - Cómo reemplazar el marcador de posición con valor

He estado tratando de trabajar con los ejemplos.FieldMailMerge yReemplazo Variable pero parece que no se puede ejecutar un caso de prueba local. Básicamente, estoy intentando comenzar con un documento de plantilla docx y hacer que cree documentos x docx a partir de esa plantilla con las variables reemplazadas.

En el código de abajodocx4jReplaceSimpleTest() intenta reemplazar una sola variable pero no lo hace. Los valores de $ {} en los archivos de plantilla se eliminan como parte del procesamiento, por lo tanto, creo que los está encontrando pero no los reemplaza por alguna razón. Entiendo que podría deberse al formato como se explica en los comentarios del código de ejemplo, pero para solucionar problemas solo para que algo funcione, lo estoy intentando de todos modos.

En el código de abajodocx4jReplaceTwoPeopleTest(), a la que quiero empezar a trabajar, trato de hacerlo de la manera que creo que es la correcta, pero eso no es encontrar ni reemplazar nada. Ni siquiera está eliminando el $ {} del archivo docx.

public static void main(String[] args) throws Exception
{
    docx4jReplaceTwoPeopleTest();
    docx4jReplaceSimpleTest();
}

private static void docx4jReplaceTwoPeopleTest() throws Exception
{
      String docxFile = "C:/temp/template.docx";

      WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File(docxFile));

      List<Map<DataFieldName, String>> data = new ArrayList<Map<DataFieldName, String>>();

      Map<DataFieldName, String> map1 = new HashMap<DataFieldName, String>();
      map1.put(new DataFieldName("Person.Firstname"), "myFirstname");
      map1.put(new DataFieldName("Person.Lastname"), "myLastname");
      data.add(map1);

      Map<DataFieldName, String> map2 = new HashMap<DataFieldName, String>();
      map2.put(new DataFieldName("Person.Firstname"), "myFriendsFirstname");
      map2.put(new DataFieldName("Person.Lastname"), "myFriendsLastname");
      data.add(map2);

      org.docx4j.model.fields.merge.MailMerger.setMERGEFIELDInOutput(OutputField.KEEP_MERGEFIELD);

      int x=0;
      for(Map<DataFieldName, String> docMapping: data) 
      {
        org.docx4j.model.fields.merge.MailMerger.performMerge(wordMLPackage, docMapping, true);
        wordMLPackage.save(new java.io.File("C:/temp/OUT__MAIL_MERGE_" + x++ + ".docx") );
      }
}

private static void docx4jReplaceSimpleTest() throws Exception
{
      String docxFile = "C:/temp/template.docx";

      WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File(docxFile));

      HashMap<String, String> mappings = new HashMap<String, String>();
      mappings.put("Person.Firstname", "myFirstname");
      mappings.put("Person.Lastname", "myLastname");

      MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
      documentPart.variableReplace(mappings);

    wordMLPackage.save(new java.io.File("C:/temp/OUT_SIMPLE.docx") );
}

El archivo docx consta del siguiente texto (no se realiza el formateo):

This is a letter to someone
Hi ${Person.Firstname} ${Person.Lastname},
How are you?
Thank you again. I wish to see you soon ${Person.Firstname}
Regards,
Someone

Tenga en cuenta que también estoy intentando reemplazar Person.Firstname al menos dos veces. Como el apellido no es reemplazado, no creo que esto tenga nada que ver con eso, pero lo estoy agregando por si acaso.

Respuestas a la pregunta(2)

Su respuesta a la pregunta