11

名前空間のない要素を含む XML ドキュメントがあり、XSLT を使用してそれらに名前空間を追加したいと考えています。ほとんどの要素は名前空間 A にあります。いくつかは名前空間 B にあります。これを行うにはどうすればよいですか?

4

3 に答える 3

14

foo.xml を使用

<foo x="1">
    <bar y="2">
        <baz z="3"/>
    </bar>
    <a-special-element n="8"/>
</foo>

および foo.xsl

    <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="a-special-element">
        <B:a-special-element xmlns:B="B">
            <xsl:apply-templates match="children()"/>
        </B:a-special-element>
    </xsl:template>

</xsl:transform>

私は得る

<foo xmlns="A" x="1">
    <bar y="2">
        <baz z="3"/>
    </bar>
    <B:a-special-element xmlns:B="B"/>
</foo>

それはあなたが探しているものですか?

于 2008-09-27T23:46:14.660 に答える
3

このレシピには2つの主要な材料が必要です。

ソースストックはアイデンティティ変換namespaceになり、メインフレーバーは属性によって与えられますxsl:element

次のテストされていないコードは、すべての要素にhttp://example.com/名前空間を追加する必要があります。

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

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

個人的なメッセージ:こんにちは、ジェニ・テニソン。私はあなたがこれを読んでいることを知っています。

于 2008-09-27T23:38:13.260 に答える
1

これが私がこれまでに持っているものです:

<xsl:template match="*">
    <xsl:element name="{local-name()}" namespace="A" >
        <xsl:apply-templates />
    </xsl:element>
</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:element には、要素からすべての属性をそのままコピーする方法がありません (use-attribute-sets はそれをカットしていないようです)。

于 2008-09-27T23:22:44.810 に答える