18

次のように、属性にのみ使用される名前空間を宣言する 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リストに追加しようとしましたが、効果がないようです。私は何を間違っていますか?

更新: XSL で名前空間を宣言し、属性を使用することで機能することがわかりましたextension-element-prefixesが、これは正しくないようです! これなら使えると思うのですが、なぜexclude-result-prefixes使えないのか知りたいです!

更新: 実際には、このextension-element-prefixesソリューションは XMLSpy の組み込み XSLT エンジンでのみ動作し、MSXML では動作しないようです。

4

4 に答える 4

5
<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>
于 2009-07-03T09:52:49.873 に答える
4

これを試してください(属性に注意してくださいcopy-namespaces='no'):

<xsl:template match="node()">
    <xsl:copy copy-namespaces="no">
            <xsl:apply-templates select="node()"/>
    </xsl:copy>
</xsl:template>
于 2012-03-28T15:16:27.750 に答える
2

これにより、出力から x 名前空間が削除されます。

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

デフォルトの名前空間を扱うときは、2 つのことを忘れないでください。最初にそれを stylesheet タグ内の何かにマップしてから、namespace-alias を使用して削除します。

于 2011-11-30T09:26:42.247 に答える