5

これは単純なケースです。

ここに私のXMLがあります:

<?xml version="1.0" encoding="utf-8" ?>
<dogs>
    <dog type="Labrador">
        <Name>Doggy</Name>
    </dog>
    <dog type="Batard">
        <Name>Unknown</Name>
    </dog>
</dogs>

この XML は 2 つの Xslt で使用されます。これは一般的なものです:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="text"/>

    <xsl:template match="dogs">
        <xsl:text>First template&#13;&#10;</xsl:text>
        <xsl:apply-templates select="." mode="othertemplate" />
    </xsl:template>
</xsl:stylesheet>

これは子のものです:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:include href="transform.xslt"/>

    <xsl:template match="dogs" mode="othertemplate">
        <xsl:text>&#9;&#9;Other template</xsl:text>
    </xsl:template>
</xsl:stylesheet>

子には共通のもの (transform.xslt と呼ばれる) が含まれます。

子を実行すると、期待される結果が得られます。

First template
        Other template

一般的なものを実行すると、次の奇妙な結果が得られます。

First template


        Doggy


        Unknown

一般的なものは、モード「othertemplate」でテンプレートを適用します。このモードは、子 xslt にのみ含まれる場合があります。

モードが「othertemplate」のテンプレートがない場合は、何も出力しないでください。

このテンプレート モードを使用する必要がないすべての xslt ファイルに、本文が空のモード「othertemplate」のテンプレートを含めたくありません...

私は何をすべきか?

ありがとう

4

2 に答える 2

10

XSLT の組み込みテンプレート ルール

XSLT の組み込みテンプレート ルール (デフォルト テンプレートとも呼ばれます) により、要素の内容と余分な空白が表示されます。これらのルールは、他に一致するテンプレートがない場合に適用されます。組み込みのテンプレート ルールは次のとおりです。

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

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

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

組み込みのテンプレート ルールは、ルート ノードと要素ノードを再帰的に処理し、テキスト (および属性ノードが選択されている場合は属性値) をコピーします。命令とコメントを処理するための組み込みのテンプレート ルールは、何もしないことです。デフォルトでは、名前空間ノードは処理されません。<xsl:apply-templates/>は実質的に の省略形で<xsl:apply-templates select="child::node()"/>あるため、属性ノードまたは名前空間ノードは選択されないことに注意してください。

すべてのモードに組み込みのテンプレート ルールもあります。これらのテンプレートは、同じモードで処理を継続する点を除いて、エレメントおよびルートのデフォルト テンプレートと似ています。

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

dogsスタイルシートにはmode と一致するテンプレートがないため、othertemplateこの組み込みのテンプレート ルールが適用され、この場合、すべての子ノードが処理され、最終的にテキスト ノードが出力されます。ソース ドキュメントの要素間のインデントとライン フィードもテキスト ノードであるため、それらも印刷され、出力に余分な空白が生じます。

終了しないループに関する警告:<xsl:apply-templates select="."/>

通常apply-templates、子孫の処理に使用されます。サンプル コードでは、呼び出し時に現在のノードを選択しましたapply-templatesapply-templatesテンプレート内のコマンドが原因でテンプレート自体が適用されると、終了しないループが発生する可能性があります。以下の例

<xsl:template match="foobar">
  <!-- This is an infinite loop -->
  <xsl:apply-templates select="."/>
</xsl:template>

ところで。スタイルシートを組み合わせる際の一般的なルールとして、どのテンプレートを実行し、どのテンプレートをインポートまたは含めるかを慎重に検討してください。(一般的な慣例として、Michael Kay は、一般的なスタイルシートを特別なケースのスタイルシートにインポートするために使用することを推奨しているようで、その逆ではないことを読んだことがあります。)<xsl:import>

于 2010-08-26T18:39:37.553 に答える
6

組み込みの XSLT テンプレートは、モードごとに定義および選択され。そのため、テキスト ノードの組み込みテンプレートが選択され、(定義により) テキスト ノードが出力されます。

これを抑制するには、空のテンプレートを使用して、目的のモードでテキスト ノード (要素の場合もある) の組み込みテンプレートをオーバーライドする必要があります。

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

インポートしたスタイルシートに上記を含めます

于 2010-08-26T18:40:39.440 に答える