0

私はxsltが初めてです。XML をあるスキーマから別のスキーマに変換しようとしています。変換後に古い名前空間を「取り除き」たい。変換自体に必要な場合、変換後に古いスキーマを消去するにはどうすればよいですか。本質的に、私は立ち去り、 (ノードの名前を変更した後)にhttp://positionskillmanagementservice.webservices.com完全に置き換えたいと考えています。http://newschemaDimitre Novatchevのメソッドを介して、必要なことのほとんどを行うことができます: xsltで要素の名前空間を変更する

これは XML です。

<ns:positionSkillResponse xmlns:ns="http://positionskillmanagementservice.webservices.com">
<ns:return>1</ns:return>
<ns:return>9</ns:return>
</ns:positionSkillResponse>

これはxsltです:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://positionskillmanagementservice.webservices.com"
  version="1.0">

  <xsl:output method="xml" />

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

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

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

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

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

このツールで動作を確認しています。

4

2 に答える 2

1

あなたの試みはあまりにも具体的です。このより一般的なものを試してください:

<xsl:stylesheet 
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns_old="http://positionskillmanagementservice.webservices.com"
>    
    <xsl:output method="xml" />

    <!-- matches any node not handled elsewhere -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>    

    <!-- matches elements in the old namespace, re-creates them in the new -->
    <xsl:template match="ns_old:*">
        <xsl:element name="ns:{local-name()}" namespace="http://newschema">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>

    <!-- if you don't have namespaced attributes you won't need this template -->
    <xsl:template match="@ns_old:*">
        <xsl:attribute name="ns:{local-name()}" namespace="http://newschema">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

以下を提供します。

<ns:positionSkillResponse xmlns:ns="http://newschema">
    <ns:return>1</ns:return>
    <ns:return>9</ns:return>
</ns:positionSkillResponse>

ノート

  • xmlns:ns="http://newschema"入力ドキュメントには実際にはその名前空間のノードがないため、XSLT で宣言する必要はありません。
  • xmlns:ns="http://positionskillmanagementservice.webservices.com"これは、古い名前空間を として宣言し、 のように使用できることも意味します<xsl:template match="ns:*">。XSL プロセッサにとってはすべて同じですが、別の接頭辞 likens_oldを使用すると、人間の読者にとっておそらく混乱が少なくなります。
  • 出力プレフィックスは任意に選択できます ( <xsl:element name="ns:{local-name()}" ...)。これは、XSLT で宣言された名前空間とは関係ありません。プレフィックスをまったく使用しないと、デフォルトの名前空間を持つドキュメントになります。

    <positionSkillResponse xmlns="http://newschema">
        <return>1</return>
        <return>9</return>
    </positionSkillResponse>
    
于 2013-04-23T03:50:30.580 に答える