我有一个带有 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 感知工具:我将使用xsltproc
XSLT,但 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
像往常一样,确认转型正在做正确的事情;我放弃了您提供的内容,因此可能需要进行其他更改才能完全转换。