0

私は次のxmlコードを持っています:

<OML>    
  <bg-def xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="EX1"/>
</OML>

XSLTを使用して属性xmlns:xsiとその値を削除し、結果が次のようになるようにします。

<OML>    
  <bg-def name="EX1"/>
</OML>

私は次のXSLTコードでこれを実行しようとしました:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex">
 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"  xml:space="preserve"/>

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

コードを書き終える前に、エディターは次のように警告しました。「W名前空間プレフィックスxmlnsが宣言されていません」。式:xsiを削除してxmlnsと書くだけで、警告は表示されなくなります。しかし、プログラムをコンパイルして実行しても、何も起こらず、期待どおりの出力が得られません。また、xsltファイルの最後の行を次のように変更しようとしています。

<xsl:template match="bg-def|@ name"/>

結果は次のようになります。

<OML>    
  <bg-def xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</OML>

つまり、属性は非常にうまく削除されています。しかし、属性xmlns:xsiを使用してこれを実行したいと思います。誰かが私にこれをするのを手伝ってもらえますか?助けてくれてありがとう。フランキー

4

2 に答える 2

0

bd-defノードには次のテンプレートを使用します。

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

それ以外の

<xsl:template match="bg-def|@ name"/>

このテンプレートはノードbg-defを作成し、すべてのコンテキストノードと属性をコピーしますが、名前空間はコピーしません

同様の質問を確認してください: 特定の要素の名前空間を削除してください

アップデート:

ソースファイル:

<OML>    
     <bg-def xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="EX1"/>
</OML>

スタイルシート:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no" xml:space="preserve"/>

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

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

</xsl:transform>

変換結果(Saxon 6.5.5-Xslt 1.0):

<?xml version="1.0" encoding="UTF-8"?><OML>    
     <bg-def name="EX1"/>
</OML>
于 2012-09-19T17:09:06.467 に答える
0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>

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

</xsl:stylesheet>
于 2012-10-11T13:46:48.497 に答える