替换 xsl 文件中的 XPath 字符串

替换 xsl 文件中的 XPath 字符串

我有一个带有 XPath 的 XSL 文件,它对应于带有 UBL 2.0 标准的 XML 文件,并且我需要 XPath 来适应 UBL 2.1 标准。

需要更改的文件数量太多,因此我尝试使用 sed 命令来替换每个文件中的 XPath。我尝试过下一个命令:

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

XPath 包含需要转义的字符,因此我怀疑用命令的当前结构替换路径是否不会出现问题。

运行命令后获取另一个文件中的输出:

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

我得到输出:

sed: -e expression #1, char 216: unterminated `s' command

答案1

修改 XML 文件时,sed这确实不是最佳选择,因为它不知道正在编辑的文件是否有结构,并且很乐意将格式良好的文档变成格式错误的文档。相反,您应该使用 XML 感知工具:我将使用xsltprocXSLT,但 XML grep 实用程序也可能完成这项工作。

第一的,制作身份转换样式表select用新属性值替换旧属性值:

替换.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>

然后运行xsltproc要转换的文件:

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

像往常一样,确认转型正在做正确的事情;我放弃了您提供的内容,因此可能需要进行其他更改才能完全转换。

相关内容