1

一部の要素に名前空間があり、他の要素にはない xml ドキュメントがあります。それらはすべて名前空間を必要とし、同じものもあれば異なるものもあります。要素には、保持したいプロパティがあります。

xml:

<foo xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gco="http://www.isotc211.org/2005/gco" xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns="http://www.isotc211.org/2005/gmd">
<bar y="2">
<baz z="3"/></bar>
<a-special-element n="8"/>
<another-special-element k="8"/>
</foo>

そしてxslt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="*">
    <xsl:element name="{local-name()}" namespace="A" >
        <xsl:copy-of select="attribute::*"/>
        <xsl:apply-templates />
    </xsl:element>
</xsl:template>

<xsl:template match="foo">
    <xx:foo xmlns:xx="xx">
        <xsl:apply-templates/>
    </xx:foo>
</xsl:template>

<xsl:template match="a-special-element">
    <B:a-special-element xmlns:B="B">
        <xsl:apply-templates/>
    </B:a-special-element>
</xsl:template>

<xsl:template match="another-special-element">
    <C:a-special-element xmlns:C="C">
        <xsl:apply-templates/>
    </C:another-special-element>
</xsl:template>

</xsl:stylesheet>

これが私が望む出力です:

<xx:foo xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gco="http://www.isotc211.org/2005/gco" xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns="http://www.isotc211.org/2005/gmd">    <bar y="2">
    <baz z="3"/>
</bar>
<B:a-special-element n="8"/>
<C:another-special-element k="4"/>

</xx:foo>

このスレッドをチェックアウトしましたが、「a-special-element」のプロパティが魔法のように削除されました。要素に名前空間を追加する

また、複数のxmlnsがあります:??? 保持したい foo で。

4

1 に答える 1

0

まず、名前空間は XML の基本的な概念です。名前空間に慣れていない場合は、時間をかけて学習し、理解してください。

一部の要素に名前空間があり、他の要素にはない xml ドキュメントがあります。

実際、コード サンプルでは、​​すべての要素が名前空間に属しています。

ルート要素のコードxmlns="http://www.isotc211.org/2005/gmd"は、デフォルトの名前空間を URI で定義します"http://www.isotc211.org/2005/gmd"。したがって、要素名に名前空間プレフィックスがない場合、この要素とその子孫は、この既定の名前空間に属します。名前空間プレフィックスがないため、要素がデフォルトの名前空間を使用している場合、要素が何らかの名前空間にあることを忘れがちです。デフォルトの名前空間は属性には適用されず、要素のみに適用されることに注意してください。

期待される結果ドキュメントが明確ではありません。xxまた、名前空間プレフィックス、Bおよびの名前空間定義も必要Cです。Aまた、名前空間は、予想される結果ドキュメントを使用するデフォルトの名前空間と同じであると想定しました。

とにかく、この入力を考えると:

<foo xmlns:gml="http://www.opengis.net/gml"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:gco="http://www.isotc211.org/2005/gco"
     xmlns="http://www.isotc211.org/2005/gmd"
     xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd"
     >
    <bar y="2">
        <baz z="3"/>
    </bar>
    <a-special-element n="8"/>
    <another-special-element k="8"/>
</foo>

この XSLT コード:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:gml="http://www.opengis.net/gml"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:gco="http://www.isotc211.org/2005/gco"
    xmlns:gmd="http://www.isotc211.org/2005/gmd"
    xmlns="http://www.isotc211.org/2005/gmd"
    xmlns:B="B"
    xmlns:C="C"
    xmlns:xx="xx"
    >

<xsl:template match="node() | @*" name="identity">
    <xsl:copy>
        <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
</xsl:template>

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

<xsl:template match="gmd:foo">
    <xx:foo>
        <xsl:apply-templates select="node() | @*"/>
    </xx:foo>
</xsl:template>

<xsl:template match="gmd:a-special-element">
    <B:a-special-element>
        <xsl:apply-templates select="node() | @*"/>
    </B:a-special-element>
</xsl:template>

<xsl:template match="gmd:another-special-element">
    <C:another-special-element>
        <xsl:apply-templates select="node() | @*"/>
    </C:another-special-element>
</xsl:template>

</xsl:stylesheet>

次の出力が生成されます。

<xx:foo xmlns:xx="xx" 
        xmlns:gml="http://www.opengis.net/gml" 
        xmlns:xlink="http://www.w3.org/1999/xlink" 
        xmlns:gco="http://www.isotc211.org/2005/gco" 
        xmlns:gmd="http://www.isotc211.org/2005/gmd" 
        xmlns="http://www.isotc211.org/2005/gmd" 
        xmlns:B="B" 
        xmlns:C="C" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd"
        >
    <bar y="2">
        <baz z="3"/>
    </bar>
    <B:a-special-element n="8"/>
    <C:another-special-element k="8"/>
</xx:foo>

ID テンプレートを使用して、入力ドキュメントの内容を再帰的にコピーする方法に注意してください。これは、一般的で便利な手法です。

XSLT ドキュメントのデフォルトの名前空間は、 で使用される要素名には適用されないことに注意してください <xsl:template match="ELEMENT-NAME">。したがって、入力ドキュメントのデフォルトの名前空間の名前空間プレフィックスを定義し、それらの要素を参照するときにそのプレフィックスを使用する必要があります (たとえば、matchおよびselect属性)。また、このため、名前空間 URI が結果ドキュメントで 2 回定義されていることにも注意してください。つまりhttp://www.isotc211.org/2005/gmd、プレフィックスgmdとデフォルトの名前空間が定義されています。これが気になる場合は、要素にexclude-result-prefixes="gmd"属性を追加できます。<xsl:stylesheet>副作用として、これによりデフォルトの名前空間定義がルート要素ではなくドキュメントの後半に表示される可能性がありますが、これは単なる視覚的な違いであり、基本的な機能は同じままです。

于 2012-12-11T23:31:24.247 に答える