XSL - 要素をコピーしますが、未使用の名前空間を削除する(S)

StackOverflow https://stackoverflow.com/questions/1074767

  •  21-08-2019
  •  | 
  •  

質問

私はこのように、属性のみに使用される名前空間を宣言し、いくつかのXMLを持ってます:

<?xml version="1.0" encoding="UTF-8"?>
<a xmlns:x="http://tempuri.com">
    <b>
        <c x:att="true"/>
        <d>hello</d>
    </b>
</a>

私は、選択したノードとその値のコピーを作成するために、XSLを使用したい - 属性を取り除きます。だから私の所望の出力があります:

<?xml version="1.0" encoding="UTF-8"?>
<b>
    <c />
    <d>hello</d>
</b>

私はほとんどこれを行い、いくつかのXSLを持っているが、私はそれは、出力のトップレベルの要素に名前空間宣言を入れて停止しているように見えることはできません。私のXSLがあります:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:apply-templates select="/a/b"/>
    </xsl:template>

    <xsl:template match="node()">
        <xsl:copy>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

出力の最初の要素ではなく<b xmlns:x="http://tempuri.com"><b>れます。私は、XSLで名前空間を宣言し、exclude-result-prefixesリストにプレフィックスを入れて試してみたが、これは何の影響も与えていないようです。私が間違って何をしているのですか?

UPDATE:私はXSL内の名前空間を宣言し、extension-element-prefixes属性を使用して動作することを発見しましたが、これは右のようではありません!私はこれを使用することができると思いますが、私はexclude-result-prefixesが動作しない理由を知りたいのです!

UPDATE:実際には、このextension-element-prefixesソリューションが唯一のXMLSpyの内蔵MSXMLとXSLTエンジン、ないで動作するようです。

役に立ちましたか?

解決

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:x="http://tempuri.com">
    <xsl:template match="/">
        <xsl:apply-templates select="/a/b"/>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name(.)}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:copy/>
    </xsl:template>

    <!-- This empty template is not needed.
Neither is the xmlns declaration above:
    <xsl:template match="@x:*"/> -->
</xsl:stylesheet>

私はここを。

の説明を見つけました
  

Michael Kayには書いてます。
  除外結果プレフィックスのみからコピーされた名前空間に影響を及ぼし   リテラル結果要素によるスタイルシート、それはのコピーには影響しません。   ソースドキュメントから名前空間ます。

他のヒント

<xsl:stylesheet 
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:x="http://tempuri.com"
  exclude-result-prefixes="x"
>

  <!-- the identity template copies everything 1:1 -->
  <xsl:template match="@* | node()">
     <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>

  <!-- this template explicitly cares for namespace'd attributes -->
  <xsl:template match="@x:*">
    <xsl:attribute name="{local-name()}">
      <xsl:value-of select="." />
    </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

これは(属性copy-namespaces='no'に注意してください)してみます:

<xsl:template match="node()">
    <xsl:copy copy-namespaces="no">
            <xsl:apply-templates select="node()"/>
    </xsl:copy>
</xsl:template>

この出力からのx名前空間を削除します。

<xsl:namespace-alias result-prefix="#default" stylesheet-prefix="x" />

あなたはデフォルトの名前空間を扱うときに、2つのことを行うことを忘れないでください。まず、スタイルシートのタグで何かにそれをマッピングして、名前空間のエイリアスを使用してそれを削除します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top