3

私は次のXMLコードを持っています

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="new_proto.xsl"?>
<Return>
 <SDSSJ type="form" />
 <JSFK type="form" />
 <KJFK type="form2" />
 <HJDHH type="form"> New Val </HJDHH>
 <NNDJB type="some"> 
    <DJSJJ type="form">
       THIS
    </DJSJJ>
    <KAKKK type="nope">
    DONT
    </KAKKK>
 Not
</NNDJB>
</Return>

属性 type='form' を持つすべてのノードの名前を取得したいだけです。そこで、次の XSL を試しました。

  1 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  2    <xsl:output method="html" omit-xml-declaration="yes" indent="no"/>
  3       <xsl:template match="//*[@type='form']">
  4       <xsl:value-of select="name()" />
  5       </xsl:template>
  6 </xsl:stylesheet>

しかし、代わりにSDSSJ JSFK HJDHH DJSJJ、私は得るSDSSJ JSFK HJDHH DJSJJ DONT Not。テンプレートに準拠していない子要素がまだ表示されているのはなぜですか? それらを取り除くにはどうすればよいですか?

4

1 に答える 1

7

このテンプレートを追加します:

<xsl:template match="text()"/>

例:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" omit-xml-declaration="yes" indent="no"/>

    <xsl:template match="//*[@type='form']">
        <xsl:value-of select="name()"/>
    </xsl:template>

    <xsl:template match="text()"/>

</xsl:stylesheet>

デフォルトでは、テキストが出力に渡されます。上記のテンプレートは、一致しないテキストを取り除きます。

デフォルトの XSLT テンプレート ルールに関する仕様の内容は次のとおりです。

スタイルシートの明示的なテンプレート ルールによるパターン マッチが成功しない場合に、再帰的な処理を続行できる組み込みのテンプレート ルールがあります。このテンプレート ルールは、要素ノードとルート ノードの両方に適用されます。以下は、組み込みのテンプレート ルールに相当するものを示しています。

<xsl:template match="*|/">
    <xsl:apply-templates/> 
</xsl:template>

各モードには組み込みのテンプレート ルールもあります。これにより、スタイルシートの明示的なテンプレート ルールによるパターン マッチが成功しない場合でも、同じモードで再帰処理を続行できます。このテンプレート ルールは、要素ノードとルート ノードの両方に適用されます。以下は、モード m の組み込みテンプレート ルールに相当するものを示しています。

<xsl:template match="*|/" mode="m">
    <xsl:apply-templates mode="m"/> 
</xsl:template>

テキストをコピーするテキストおよび属性ノード用の組み込みのテンプレート ルールもあります。

<xsl:template match="text()|@*">
    <xsl:value-of select="."/> 
</xsl:template>

命令とコメントを処理するための組み込みのテンプレート ルールは、何もしないことです。

<xsl:template match="processing-instruction()|comment()"/>

名前空間ノードの組み込みテンプレート ルールも、何もしないことです。名前空間ノードに一致するパターンはありません。そのため、組み込みのテンプレート ルールは、ネームスペース ノードに適用される唯一のテンプレート ルールです。

組み込みのテンプレート ルールは、スタイルシートの前に暗黙的にインポートされたかのように扱われるため、他のすべてのテンプレート ルールよりもインポートの優先順位が低くなります。したがって、作成者は、明示的なテンプレート ルールを含めることで、組み込みのテンプレート ルールをオーバーライドできます。

于 2012-10-24T23:02:48.410 に答える