1

ルート ノードを変更するために必要な XML ドキュメントがありました。私がネットからかき集めたわずかな知識で、XML の子ノードに新しい xmlns 属性が含まれていることを除けば、私が望むものと同じように見えるものを得ることができました。変換を適用した XML は次のようになります。

<gmd:MD_Metadata xmlns="http://www.isotc211.org/2005/gmd" 
  xmlns:gco="http://www.isotc211.org/2005/gco" 
  xmlns:gmd="http://www.isotc211.org/2005/gmd" 
  xmlns:gmi="http://www.isotc211.org/2005/gmi" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:gmx="http://www.isotc211.org/2005/gmx" 
  xmlns:gsr="http://www.isotc211.org/2005/gsr" 
  xmlns:gss="http://www.isotc211.org/2005/gss" 
  xmlns:gts="http://www.isotc211.org/2005/gts" 
  xmlns:srv="http://www.isotc211.org/2005/srv" 
  xmlns:xlink="http://www.w3.org/1999/xlink" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://www.isotc211.org/2005/gmd 
  http://www.ngdc.noaa.gov/metadata/published/xsd/schema/gmd/gmd.xsd">
  <gmd:language>
    <gmd:LanguageCode 
      codeList="http://www.loc.gov/standards/iso639-2/php/code_list.php" 
      codeListValue="eng" codeSpace="ISO639-2"
      >eng</gmd:LanguageCode>
    </gmd:language>
    ......
</gmd:MD_Metadata>

私の XSLT は次のようになります。

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:gmd="http://www.isotc211.org/2005/gmd"
  xmlns:gco="http://www.isotc211.org/2005/gco"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:gmi="http://www.isotc211.org/2005/gmi">

  <xsl:output omit-xml-declaration="yes"  indent="yes"/> 

  <xsl:template match="/">
    <gmi:MI_Metadata 
      xmlns="http://www.isotc211.org/2005/gmi" 
      xmlns:gco="http://www.isotc211.org/2005/gco" 
      xmlns:gmd="http://www.isotc211.org/2005/gmd"  
      xmlns:gmi="http://www.isotc211.org/2005/gmi"  
      xmlns:gml="http://www.opengis.net/gml"  
      xmlns:gmx="http://www.isotc211.org/2005/gmx"  
      xmlns:gsr="http://www.isotc211.org/2005/gsr"  
      xmlns:gss="http://www.isotc211.org/2005/gss"  
      xmlns:gts="http://www.isotc211.org/2005/gts"  
      xmlns:xlink="http://www.w3.org/1999/xlink"  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
      xmlns:srv="http://www.isotc211.org/2005/srv"  
      xsi:schemaLocation="http://www.isotc211.org/2005/gmi  
      http://www.ngdc.noaa.gov/metadata/published/xsd/schema.xsd" >
      <xsl:for-each select="/*/node()|@*">
        <xsl:copy-of select="." />
      </xsl:for-each>
    </gmi:MI_Metadata>
  </xsl:template>
</xsl:stylesheet>

出力は次のようになります。

<gmi:MI_Metadata xmlns="http://www.isotc211.org/2005/gmi"  
      xmlns:gco="http://www.isotc211.org/2005/gco"  
      xmlns:gmd="http://www.isotc211.org/2005/gmd"  
      xmlns:gmi="http://www.isotc211.org/2005/gmi"  
      xmlns:gml="http://www.opengis.net/gml"  
      xmlns:gmx="http://www.isotc211.org/2005/gmx"  
      xmlns:gsr="http://www.isotc211.org/2005/gsr"  
      xmlns:gss="http://www.isotc211.org/2005/gss"  
      xmlns:gts="http://www.isotc211.org/2005/gts"  
      xmlns:srv="http://www.isotc211.org/2005/srv"  
      xmlns:v1="http://www.isotc211.org/2005/gmd"  
      xmlns:xlink="http://www.w3.org/1999/xlink"  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
      xsi:schemaLocation="http://www.isotc211.org/2005/gmi  
      http://www.ngdc.noaa.gov/metadata/published/xsd/schema.xsd">
  <gmd:language xmlns="http://www.isotc211.org/2005/gmd">
    <gmd:LanguageCode  
      codeList="http://www.loc.gov/standards/iso639-2/php/code_list.php"  
      codeListValue="eng" codeSpace="ISO639-2" 
      >eng</gmd:LanguageCode>
    </gmd:language>
    .......
</gmi:MI_Metadata>

子ノードの出力にxmlns="http://www.isotc211.org/2005/gmd"が含まれないようにしたかったのですが、それを実現する方法はありますか? xslt の一部を次のように変更すると、次のことに気付きました。

<xsl:template match="/">
<gmi:MI_Metadata xmlns="http://www.isotc211.org/2005/gmd" ....

xmlns は消えますが、ヘッダー/ルート ノードは、クライアントが出力で望んでいるものではありません! だから、自分に何ができるのかわからなかった。あなたの洞察は非常に高く評価されます、ありがとう。

4

2 に答える 2

1

に関係なくexclude-result-prefixes仕様xsl:copy-ofに従って名前空間をコピーします。

xsl:copy-of 要素を使用して、結果ツリー フラグメントを結果ツリーに挿入できます...[結果がノード セットの場合、セット内のすべてのノードがドキュメント順に結果ツリーにコピーされます] ; 要素ノードをコピーすると、要素ノード自体だけでなく、属性ノード、名前空間ノード、要素ノードの子もコピーされます...

したがって、自分でコピーする必要があります。たとえば、要素をコピーするルールであるソリューションの 1 つを次に示します。

<xsl:template match="*" mode="copy" priority="1">
    <xsl:element name="{name()}">
        <xsl:apply-templates select="node()|@*" mode="copy"/>
    </xsl:element>
</xsl:template>

次に、通常どおりコピーします

<xsl:template match="node()|@*" mode="copy">
    <xsl:copy />      
</xsl:template>

次に、コードで次のことができます

<xsl:for-each select="/*/node()|@*">
    <xsl:apply-templates mode="copy" select="." />
</xsl:for-each>
于 2013-06-06T04:15:16.927 に答える