次の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
。
- XSLTを使用してXMLファイルから名前空間とそのプレフィックスを削除する方法は?- IBM
- XSLT:要素から名前空間プレフィックスを削除する- スタックオーバーフロー
以下の例では、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
。