![Localizar-substituir na hierarquia de arquivos XML](https://rvso.com/image/1497070/Localizar-substituir%20na%20hierarquia%20de%20arquivos%20XML.png)
Tenho cerca de 350 arquivos XML espalhados pelo /abc
diretório. Gostaria de encontrar todas as instâncias em que o valor do atributo alt seja exatamente 'blá, blá':
<image alt="blah blah" src="../webcontent/filename.png">
<caption>
Figure 1.1: Typical Components of Blah Blah
</caption>
</image>
e substitua o valor do alt
atributo pelo conteúdo entre caption
(removendo novas linhas)
<image alt="Figure 1.1: Typical Components of Blah Blah" src="../webcontent/filename.png">
<caption>
Figure 1.1: Typical Components of Blah Blah
</caption>
</image>
Estou aberto para executar um script no Ubuntu ou Windows ou usar qualquer ferramenta de edição de texto.
Não é seguro presumir que as novas linhas e o recuo sejam consistentes. Além disso, nem todas as imagens têm legenda. Todos os documentos XML no caminho estão bem formados.
Existe uma maneira simples de criar um script para essa substituição no local? Eu estaria aberto a algo que funcionasse para um único arquivo; Posso estendê-lo para ser executado recursivamente.
Responder1
Para um único arquivo, a seguinte folha de estilo XSLT fará o trabalho:
<t:transform version="1.0" xmlns:t="http://www.w3.org/1999/XSL/Transform">
<t:template match="node()|@*">
<t:copy>
<t:apply-templates select="node()|@*"/>
</t:copy>
</t:template>
<t:template match="image/@alt[. = 'blah blah']">
<t:attribute name="alt" select="normalize-space(../caption)"/>
</t:template>
</t:transform>
Para processar vários arquivos, você pode invocar a folha de estilo várias vezes a partir de algum script de shell, script Ant ou similar (ou olhar para xmlsh), ou se estiver usando um processador XSLT 2.0 como o Saxon, você pode criar um script dentro do próprio XSLT usando a função coleção()
Responder2
Você também pode usar xmlstarlet
:
xmlstarlet ed -u '//image/@alt[.= "blah blah"]' -x "normalize-space(../caption/text())"