11

「exclude-result-prefixes」と書いたのですが、それでも出力に名前空間オカレンスの外観が表示されます。

<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:simple="Simple name space"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:tcm="http://www.tridion.com/ContentManager/5.0"
    xmlns:xh="http://www.w3.org/1999/xhtml"
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:transform-ext="urn:tridion:transform-ext"
    xmlns="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="#default simple xh">

実際の出力

<strong xmlns="Simple name space">abcd
    <link xmlns="http://www.w3.org/1999/xhtml">
        <text>Header</text>
    </link>
</strong>

単一のステートメントを記述してすべての名前空間を除外できるようにする方法はありますか?

ここで私は明示的に言及しました

exclude-result-prefixes="#default simple xh"

xsltですべての名前空間が表示されないようにするにはどうすればよいですか?

4

4 に答える 4

8

exclude-result-prefixes属性はxsl:stylesheet、として指定された場合、継承され、リテラル結果要素の名前空間uriとプレフィックスの両方を定義しないリテラル結果要素"yes"(のみ)の名前空間ノードの削除を義務付けます。

Markus Jarderotによる回答の次のステートメントは間違っています:

「exclude-result-prefixesは、結果のルートタグのxmlns:foo=""属性を削除するだけです。」

これが反例です

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:z="z:z" exclude-result-prefixes="z">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <z:x xmlns:z="z:z">
   <z:y/>
  </z:x>
 </xsl:template>
</xsl:stylesheet>

この変換がXMLドキュメント(使用されていない)に適用されると、結果は次のようになります。

<z:x xmlns:z="z:z">
   <z:y/>
</z:x>

私たちはそれを見ます

  1. 値(namespace-uri) "z:z"を持つ名前空間の名前空間ノード(および定義)は、最上位要素(Markus Jarderotが「ルートタグ」と呼ぶもの)から削除されません。

  2. プレフィックス付きの名前空間"z"は、リテラル要素からまったく削除されません。

これは、指定するexclude-result-prefixes="yes"ことで名前空間がLRE(リテラル結果要素)上にない場合、および名前空間ノードがLRE上にあるが、要素が属する名前空間を定義している場合でも、名前空間を削除できないという単純な事実を示しています。

要素が属する名前空間から要素を削除したり、非LRE要素から名前空間を削除したりするには、いくつかの追加処理を指定する必要があります。

1つの例は、従来のIDルールを次のように置き換えることです。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()[not(self::*)]">
     <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>

上記の変換は、要素または属性を「名前空間なし」に属する対応する要素または属性に置き換えます。これの潜在的な用途の1つは、デフォルトの名前空間を持つドキュメントをそのような名前空間のないドキュメントに変換することです。

たとえば、次のソースXMLドキュメントに適用した場合

<z:x xmlns:z="z:z">
    <z:y z:attr="someValue"/>
</z:x>

変換の結果は次のとおりです。

<x>
   <y attr="someValue"/>
</x>

最後に警告

この変換は、同じローカル名を持つが2つの異なる名前空間に属する2つの要素(または2つの属性)を含むドキュメントに適用すると有害な場合があります。変換により、これらは両方とも同じ名前空間に属する要素(または属性)に置き換えられます(名前空間なし)。

于 2012-06-25T12:37:45.120 に答える
3

exclude-result-prefixesxmlns:foo=""結果のルートタグの属性を削除するだけです。タグは引き続き同じ名前空間にバインドされます。タグには一致するプレフィックスがないため、デフォルトの名前空間が使用されます。

名前空間を完全に削除したい場合は、次のスタイルシートを使用できます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="no"/>

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

(出典:TEI wiki

于 2012-06-25T11:40:22.350 に答える
2

Exclusive-result-prefixes属性は、(状況によっては)未使用の名前空間宣言を出力から削除します。結果の要素と属性に実際に使用されている名前空間を削除することはありません。つまり、要素と属性の名前を変更して別の名前空間(または名前空間なし)に配置することはありません。要素を名前空間に入れないようにする場合は、リテラル結果要素、xsl:element、またはxsl:copyのいずれを使用する場合でも、要素を生成するときに要素を名前空間に入れないようにする必要があります。

于 2012-06-25T14:25:17.877 に答える
0

これをスタイルシートで使用してみてください。

<stylesheet
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:xhtml="http://www.w3.org/1999/xhtml"   ...etc >

私はこれをいくつかのタグの中に持っていました:xmlns="http://www.w3.org/1999/xhtml、それで私はそれらの2行を追加しました。

このソースは私を助けました:http://xmlplease.com/xhtmlxhtml

于 2013-04-17T14:45:41.787 に答える