1

<span></span><span></span><span></span>に変換するが<span><span><span></span></span></span>、変換しない原因は何<span>a</span><span>a</span><span>a</span>ですか?

4

1 に答える 1

1

使用:

<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="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()[1]|@*"/>
  </xsl:copy>
  <xsl:apply-templates select="following-sibling::node()[1]"/>
 </xsl:template>

  <xsl:template match="span[not(node())]">
  <span>
   <xsl:apply-templates select="following-sibling::*[1][self::span[not(node())]]"/>
  </span>
 </xsl:template>
</xsl:stylesheet>

この変換が次のドキュメント(整形式の XML ドキュメントになるように、単一の最上位要素にラップされた、提供されたフラグメント) に適用される場合:

<p>
<span></span><span></span><span></span>
</p

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

<p>
   <span>
      <span>
         <span/>
      </span>
   </span>
</p>

また、必要に応じて、同じ変換 (上記) をこの XML ドキュメントに適用すると、次のようになります

<p>
 <span>a</span><span>a</span><span>a</span>
 <span></span><span></span><span></span>
</p>

span結果は、子ノードを持つ要素を「そのまま」保持します。

<p>
   <span>a</span>
   <span>a</span>
   <span>a</span>
   <span>
      <span>
         <span/>
      </span>
   </span>
</p>

説明:

  1. すべてのノードを「そのまま」コピーし、一度に 1 つのノードだけをコピーする「きめの細かい」アイデンティティ ルールを使用します。

  2. span子ノードを持たない要素の詳細な ID テンプレートをオーバーライドする単一のテンプレートがあります。要素を再作成し、空のspan要素でもある最初の兄弟を処理します。

于 2012-11-09T03:49:33.413 に答える