20

XSLTを使用して、XMLドキュメントで非常に単純な変換を行っています。特定の名前のすべての要素ノードを削除したいだけです。私のソースドキュメントでは、これらのノードはすべてドキュメントの最後にありますが、変換後、ノードは意図したとおりに消えましたが、その場所に空の行がたくさんあります。

私は変換で望んでいたことを達成したので、これは厳密に表面的な問題ですが、好奇心から:これらの空の行をどのように取り除くことができますか?これは、変換に使用したXSLファイルです(削除したい要素の名前は「relations」です)。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" />

  <xsl:template match="*">
    <xsl:copy>
      <xsl:copy-of select="@*" />
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="relation"/>

</xsl:stylesheet>
4

1 に答える 1

32

その理由は、削除された要素の直接の兄弟である空白のみのテキスト ノードにあります

解決策: 次の XSLT 命令を追加して、変換が開始される前であっても、空白のみのテキスト ノードを削除します。

 <xsl:strip-space elements="*"/>

結果はインデントを失う可能性があります -- もしそうなら、これを追加してください:

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

完全な変換は次のようになります。

<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:copy>
            <xsl:copy-of select="@*" />
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="relation"/>
</xsl:stylesheet>

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

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>

  <relation/>
  <relation/>
  <relation/>
  <relation/>
  <relation/>
  <relation/>
  <relation/>
  <relation/>
</nums>

必要な正しい結果 (末尾の空白なし) が生成されます。

<nums>
   <num>01</num>
   <num>02</num>
   <num>03</num>
   <num>04</num>
   <num>05</num>
   <num>06</num>
   <num>07</num>
   <num>08</num>
   <num>09</num>
   <num>10</num>
</nums>
于 2012-05-23T02:28:40.317 に答える