大家。 我需要以下事项的帮助。 我有一个带有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包含需要转义的字符,所以我的疑问是,用命令的当前结构替换路径是否没有问题
答案 0 :(得分:1)
不适用于带有正则表达式的XML。
由于XSLT本身就是XML,因此可以使用XSLT对其进行编辑。从身份转换开始,并为要修改的属性添加特定的模板。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="xsl:apply-templates/@select[
. = '/ns1:Invoice/cac:AccountingSupplierParty/cbc:CustomerAssignedAccountID'
]">
<xsl:attribute name="select">
<xsl:text>/ns1:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID</xsl:text>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
适用于
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output encoding="utf-8"/>
<xsl:template match="/">
<xsl:apply-templates select="/ns1:Invoice/cac:AccountingSupplierParty/cbc:CustomerAssignedAccountID" />
</xsl:template>
</xsl:stylesheet>
产生
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output encoding="utf-8"/>
<xsl:template match="/">
<xsl:apply-templates select="/ns1:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID"/>
</xsl:template>
</xsl:stylesheet>