Substituindo a cadeia XPath no arquivo xsl

0

Eu tenho um arquivo XSL com XPath que corresponde a um arquivo XML com o padrão UBL 2.0 e preciso que o XPath se encaixe no padrão UBL 2.1.

O número de arquivos que precisam da mudança é muito numeroso, por isso estou tentando usar o comando sed para substituir o XPath em cada arquivo. Eu tentei o próximo comando:

sed -i 's/select="\/ns1:Invoice\/cac:AccountingSupplierParty\/cbc:CustomerAssignedAccountID"\/>/select="\/ns1:Invoice\/cac:AccountingSupplierParty\/cac:Party\/cac:PartyIdentification\/cbc:ID"\/>/g' path/to/file

O XPath contém caracteres que precisam ser escapados, então minha dúvida é se não terei problemas com a substituição dos caminhos pela estrutura atual do comando.

Depois de executar o comando para obter a saída em outro arquivo:

sed -e 's/select="\/ns1:Invoice\/cac:AccountingSupplierParty\/cbc:CustomerAssignedAccountID"\/>/select="\/ns1:Invoice\/cac:AccountingSupplierParty\/cac:Party\/cac:PartyIdentification\/cbc:ID"\/>/g' file > output

Eu obtenho a saída:

sed: -e expression #1, char 216: unterminated 's' command
    
por Fernando Bravo Diaz 21.08.2018 / 19:51

1 resposta

3

Ao modificar arquivos XML, sed realmente não é a melhor escolha, pois não tem idéia de que há estrutura no arquivo que está sendo editado e ficará feliz em transformar um documento bem-formado em um mush mal formado. Em vez disso, você deve usar uma ferramenta com reconhecimento de XML: utilizarei xsltproc e XSLT, mas um utilitário XML grep provavelmente também executaria o trabalho.

Primeiro, faça uma folha de estilo de transformação de identidade que substitui o antigo valor do atributo select pelo novo:

replace.xslt

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.w3.org/TR/xhtml1/strict">
<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="@select[contains(.,'/ns1:Invoice/cac:AccountingSupplierParty/cbc:CustomerAssignedAccountID')]">
  <xsl:attribute name="select">
    <xsl:value-of select="'/ns1:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID'"/>
  </xsl:attribute>
</xsl:template>
</xsl:stylesheet>

Em seguida, execute xsltproc no arquivo a ser convertido:

xsltproc replace.xslt /path/to/inputfile.xml > /path/to/convertedfile.xml

Como de costume, confirme que a transformação está fazendo a coisa certa; Saí do que você forneceu, para que outras alterações sejam necessárias para uma conversão completa.

    
por 21.08.2018 / 20:59