1

私は次のようなxmlを持っています

<Publication xmlns:n1="http://www.w3.org/2001/XMLSchema-instance" n1:noNamespaceSchemaLocation="InformaKMSStructure.xsd"

xmlns:n1="http://www.w3.org/2001/XMLSchema-instance" および n1:noNamespaceSchemaLocation="InformaKMSStructure.xsd" ではなく、すべての XML をコピーしたい

4

2 に答える 2

2

この変換

<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="*">
     <xsl:element name="{name()}" namespace="{namespace-uri()}">
       <xsl:apply-templates select="node()|@*"/>
     </xsl:element>
 </xsl:template>

 <xsl:template match="node()[not(self::*)]|@*">
  <xsl:copy/>
 </xsl:template>

 <xsl:template match=
 "@*[namespace-uri() = 'http://www.w3.org/2001/XMLSchema-instance']"/>
</xsl:stylesheet>

次のXMLドキュメントに適用した場合(提供されていません!):

<Publication
 xmlns:n1="http://www.w3.org/2001/XMLSchema-instance"
 n1:noNamespaceSchemaLocation="InformaKMSStructure.xsd">
  <a x="y">
   <b/>
  </a>

  <c/>
</Publication>

必要な正しい結果を生成します。

<Publication>
   <a x="y">
      <b/>
   </a>
   <c/>
</Publication>

説明

これは、IDルールをオーバーライドする通常のパターンに従いますが、IDルールは2つのテンプレートに置き換えられます。1つは任意の要素に一致し、もう1つは他のノードまたは属性に一致します。

于 2012-05-24T11:26:08.133 に答える
1

n1:noNamespaceSchemaLocation="InformaKMSStructure.xsd" は通常の属性であり、XSLT で「削除」する方法は、コピーを控えることです。XSLT で何もしない場合、出力は生成されません。そのため、何かを出力したくない場合は、それを出力しているコードを見つけて変更する必要があります。コードを見せていないので、変更方法を教えてもらえません。

xmlns:n1="http://www.w3.org/2001/XMLSchema-instance" は異なります。XPath データ モデルでは、属性としてではなく名前空間として扱われます。実際、この名前空間宣言が存在すると、そのスコープ内のすべての要素に名前空間ノードが存在します。これらの名前空間を取り除くには、どの命令が名前空間をコピーし、どの命令がコピーしないかを理解する必要があります。XSLT 1.0 では、xsl:copy および xsl:copy-of を要素に適用すると、すべての要素の名前空間がコピーされます (その要素または先祖で宣言されているかどうかにかかわらず)。これを防ぐには、XSLT 2.0 で を使用できます<xsl:copy copy-namespaces="no">が、1.0 では xsl:copy ではなく xsl:element を使用して要素を再構築するしかありません。

于 2012-05-24T13:02:41.470 に答える