UBL 2.0 표준의 XML 파일에 해당하는 XPath가 포함된 XSL 파일이 있는데 UBL 2.1 표준에 적응하려면 XPath가 필요합니다.
변경할 파일이 너무 많아서 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 유틸리티도 이 작업을 수행할 수도 있습니다.
첫 번째,ID 변환 스타일시트 만들기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
평소와 같이 변환이 올바르게 수행되고 있는지 확인하십시오. 귀하가 제공한 내용을 생략하므로 완전히 변환하려면 다른 변경이 필요할 수 있습니다.