다음 XML에서 모든 네임스페이스 속성을 제거하고 싶습니다.
<md:EntityDescriptor xmlns="urn:_" xmlns:md="_"></md:EntityDescriptor>
다음 명령을 사용하여 제거를 시도했지만 xmlns
어쨌든 입력이 변경되지 않습니다.
xmlstarlet ed \
-N n="urn:oasis:names:tc:SAML:2.0:metadata" \
-d '/md:EntityDescriptor/@*[n:name()="xmlns"]' \
<<< '<md:EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:md="_"></md:EntityDescriptor>' \
> ttt.xml
예상 출력:
<md:EntityDescriptor></md:EntityDescriptor>
답변1
이를 수행하기 위한 몇 가지 XSLT 솔루션을 찾았는데, 둘 다 다음을 사용하여 쉽게 처리됩니다 xmlstarlet
.
아래 작업 예제에서는 IBM 코드를 사용하여 파일에 저장했습니다 xslt_ibm
.
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- https://www.ibm.com/support/pages/how-remove-namespace-and-its-prefixes-xml-file-using-xslt -->
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/|comment()|processing-instruction()">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
XML 파일을 파일에 저장하려는 경우 file.xml
이 명령은 네임스페이스 외부의 모든 요소와 속성의 이름을 바꿉니다.
xmlstarlet transform xslt_ibm file.xml
입력 ( file.xml
)
<md:EntityDescriptor xmlns="urn:_" xmlns:md="_"></md:EntityDescriptor>
산출
<?xml version="1.0"?>
<EntityDescriptor/>
답변2
Andrey Kislyuk의 xq
XML 구문 분석 래퍼 사용 jq
(yq
):
xq -x 'walk(del( .["@xmlns"]?, .["@xmlns:md"]? ))' file
그러면 XML 문서 구조의 모든 노드를 탐색하고 발견된 모든 속성을 제거합니다 xmlns
.xmlns:md
일부 입력 문서가 주어지면
<?xml version="1.0"?>
<root test="val">
<md:EntityDescriptor xmlns="urn:_" xmlns:md="_"/>
</root>
... 출력됩니다
<root test="val">
<md:EntityDescriptor></md:EntityDescriptor>
</root>
--in-place
내부 편집을 위해 또는 옵션을 사용할 수 있습니다 -i
.