4

次のXMLがあり、XMLドキュメントにどちらの形式でも表示できます。

<Message xsi:schemaLocation="http://www.location.com StructureFile.xsd" xmlns=http://www.thenamespace.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

また

<Message xmlns="http://www.thenamespace.com">

出力は次のようにする必要があります。

<Message xmlns="http://www.theNEWnamespace.com">

私は現在、2つのxmlの可能性の短いバージョンを処理するためにこのテンプレートを持っています:

<xsl:template match="*">
  <xsl:element name="{name()}" namespace="http://www.theNEWnamespace.com">
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

ただし、これにより、xmlのSchemeLocationまたはxmlns:xsi部分が存在する場合、それらは削除されません。

両方の可能性を処理するために、上記をどのように適応させるのでしょうか。

乾杯、

編集:XML構造:

<?xml version="1.0" encoding="utf-8"?>
<Message xsi:schemaLocation="http://www.location.com StructureFile.xsd" xmlns="http://www.thenamespace.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Header>
    <Info></Info>
  </Header>
</Message>
4

2 に答える 2

5

これが、必要な結果を生成する完全な変換です。

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

 <xsl:template match="x:Message">
  <xsl:element name="{name()}" namespace="http://www.theNEWnamespace.com">
    <xsl:copy-of select="@*[not(name() = 'xsi:SchemaLocation')]"/>
    <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

この変換が次のXMLドキュメントに適用される場合(提供されていません!):

<t>
  <Message
  xsi:SchemaLocation="http://www.location.com StructureFile.xsd"
  xmlns="http://www.thenamespace.com"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</t>

必要な正しい結果が生成されます。

<Message xmlns="http://www.theNEWnamespace.com"/>
于 2012-04-19T12:10:51.443 に答える
2

まず、XSLT / XPathデータモデルでxsi:schemaLocationは、属性のみです。その属性または属性をまったくコピーしたくない場合は、<xsl:copy-of select="@*"/>すべての属性を明示的にコピーするため、コピーしないでください。または、コピーしない属性を選択的に指定する場合は、<xsl:copy-of select="@*"/>put inの代わりに、<xsl:apply-templates select="@*"/>属性をコピーするためのテンプレートを1つ作成してから、コピーしたくない属性のテンプレートを作成します。

<xsl:template match="@*">
  <xsl:copy/>
</xsl:template>

<xsl:template match="@xsi:schemaLocation"/>

に関してはxmlns:xsi、これは名前空間宣言であり、XSLT/XPathデータモデルでは属性ではありません。また、要素ノードに対して行うのが、表示したテンプレートだけである場合、その名前空間を出力にコピーする方法がわかりません。

ただし、スタイルシートでも名前空間を定義する場合はexclude-result-prefixes="xsi"xsl:stylesheet要素に必要です。

于 2012-04-19T11:16:41.443 に答える