1

なぜこの行はありません:

apply-templates select="*/*(XSLT ファイルの「shop」要素の下)

に太字の書式を適用しBlake2ますか? 出力は次のようになります。

XSLT のルートの開始

「ステップ 1 開始」Alexis (タスク: 営業) Employee2 (タスク: ) Blake2 「ステップ 1 完了」

XSLT のルートの終わり

私の質問は、なぜBlake2太字でもないのですか? 要素の下にあり<employee>ます。

その行を に変更*apply-templates select="*"するBlake2と、太字になります。これが違う理由は何ですか?

XML ファイルは次のとおりです。

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="2.xsl" ?>

<root>
    <shop>
        <person> 
            <employee> 
                <name> Alexis </name> 
                <role> Manager </role> 
                <task> Sales </task> 
            </employee> 

            <employee>
                <name> Employee2 </name>
            </employee>
        </person>

        <employee>
            <name> Blake2 </name>
        </employee>

    </shop>

</root>

XSLT ファイルは次のとおりです。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="root"> 
<html><head></head> 
<body>
Start of root in XSLT <p/> <xsl:apply-templates /> <p/>

End of root in XSLT

</body> 
</html> 
</xsl:template> 

<xsl:template match="shop">
"Step 1 start"
<xsl:apply-templates select="*/*"/>
"Step 1 done" <p/>
</xsl:template> 

<xsl:template match="employee"> 
<b> <xsl:apply-templates select="name"/> </b> 
(Task: <xsl:apply-templates select="task"/>) 
<br></br> 
</xsl:template> 

</xsl:stylesheet>
4

2 に答える 2

0

まず、xsltプロセッサがどのように機能するかを見てみましょう。xslt内のテンプレートを実行/インスタンス化/アクティブ化するには、それらが「一致」している必要があります。さて、これを自問してみてください。

  • 彼らは何に一致しますか?
  • たとえば、満足するものmatch="root"は何ですか?

xsltがロードされると、入力ドキュメント、つまりその最上位ノードが注目されます。入力ドキュメントはノードで始まるrootため、最初にxsltに入ります。すぐに満たすmatch="root"。単純。

さて、employeeその小さな宝石はいつマッチしますか?

xsltプロセッサは、考えられるすべてのノードをループして、一致するテンプレートがあるかどうかを確認するわけではありません。それはあなたがそれを指示したノードに対してのみそれを行います

  • これはあなたがすることですxsl:apply-templates select='...'
  • 入力の-ノードをemployeexslt-edにするには、xsl:apply-templatesどこかで選択する必要があります。

さて、何が起こったのですか?shopテンプレートでは、テンプレートを適用することを選択します。これ*/*は、「現在のノードの子の子」(必要に応じて「孫」)を意味します。

  • shopテンプレート内の現在のノードはshop、personノード内の2つのemployeeノードが選択される(*/*に展開されるperson/employee)ことを意味します。
  • Blake2はshopノードの兄弟であり、選択されません。
  • に変更する*と、ショップノードの子であるノードとノードがselect返されます。personemployee

では、太字ではないBlake2はどこから来たのでしょうか。太字ではないBlake2は、作成したテンプレートに由来するものではありません。デフォルトの動作の犠牲になっているだけで、要素ノードではなくテキストノードが入力から出力にコピーされます。


xsltを実際に使用したい場合は、学ぶべきことがいくつかあります。Identity-transform(Googleはあなたの友達)から始めて、空のテンプレートを提供していくつかの要素を削除することをお勧めします。たとえば、1対1の翻訳を行うよりも、すべての要素を大文字にします。属性を混ぜます。xpath条件([this stuff])を使用して、より厳密な一致を作成してみてください。条件文やループ構造など、より複雑な構造を見てください。変数、パラメーター、および呼び出しテンプレートについて詳しく説明します。document()を使用します。

楽しむ!

于 2012-06-10T12:04:11.150 に答える
-1

<employee>3 番目のテンプレートは、ドキュメント内の要素を選択しません。<employee>現在の要素の直接の子ノードである要素を選択するだけです。ルート レベルでは、これはどの要素にも適用されませんが、2 番目のテンプレートが<apply-templates>最初の要素で呼び出され、2 番目のテンプレートが (相対!) パス*/*(つまり、の子である要素のテンプレート) を使用してテンプレートを適用するためです。現在の要素の子)、<employee>要素内の<person>要素が選択されます。

2 番目の<employee>要素は要素の子の子ではなく、<shop>要素の直接の子であるため、 at で開始して<shop>も選択されません。*/*<shop>

に変更*/*すると*、両方の<employee>要素が選択されます: 2 番目の要素は、直接一致する*( の直接の子<shop>) ため、選択されます。*も選択<person>し、その要素に指定されたテンプレートがないため、デフォルトの動作が実行されます。<person>つまり、最初の<employee>要素を含む の子にテンプレートが適用されます。

于 2012-06-10T09:17:41.787 に答える