xmlstarletを使用して、xmlからすべての名前空間属性を削除します。

xmlstarletを使用して、xmlからすべての名前空間属性を削除します。

次の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

  1. XSLTを使用してXMLファイルから名前空間とそのプレフィックスを削除する方法は?- IBM
  2. 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/>

おすすめ記事