Hola,
Aunque efectivamente se puede hacer directamente con siblings con DOCXPath, el desarrollador encargado de hacer tu ejemplo, propone una solución que es más sencilla: combinar DOCXPath y los bloques de phpdocx.
Este es un ejemplo práctico:
<?php
require_once 'classes/CreateDocx.inc';
$docx = new CreateDocx();
$docx->addText('$BLOCK_CONTENT_1$');
$docx->addText('Text in a block.');
$docx->addText('$BLOCK_CONTENT_1$');
$docx->addText('Other text.');
$docx->createDocx('output_block');
$docxTemplate = new CreateDocxFromTemplate('output_block.docx');
$content = new WordFragment($docxTemplate, 'document');
$content->addText('New text.', array('fontSize' => 20, 'color' => '#0000ff'));
$referenceNode = array(
'type' => 'paragraph',
'ocurrence' => 2,
'contains' => '$BLOCK_CONTENT_1$',
);
$docxTemplate->insertWordFragment($content, $referenceNode, 'after');
$docxTemplate->deleteTemplateBlock('CONTENT_1');
$docxTemplate->createDocx('output_result');
Aunque este ejemplo añade los bloques de manera dinámica, también funciona perfectamente trabajando directamente con templates.
Los pasos generales son:
- Rodeas de placeholders de tipo bloque cada contenido a reemplazar (puede ser uno, dos o más contenidos).
- Con insertWordFragment de DOCXPath añades el nuevo wordFragment tras el segundo placeholder del bloque a reemplazar.
- Con deleteTemplateBlock eliminas el bloque deseado.
Estos mismos pasos los puedes seguir para todos los bloques y te da la misma flexibilidad que con DOCXPath pero de manera más flexible gracias a utilizar bloques.
También comentarte que al utilizar atributos en DOCXPath es necesario indicar el namespace del atributo en caso de usarlo. Por ejemplo:
'attributes' => array(
'w:name' => "chapter_module_$chapter[id]"
)
Saludos.