2017-02-17 7 views
0

XSL:XSLT 1.0:マッチのみの優先順位に基づいて、2つのテンプレートの1

<xsl:template match="/"> 
    <xsl:apply-templates select="*[local-name(.)='root']/*[local-name(.)='child1']" /> 
    <xsl:apply-templates select="*[local-name(.)='root']/*[local-name(.)='child2']/*[local-name()='anotherchild1']" /> 
</xsl:template> 

<xsl:template match="*[local-name(.)='child1']"> 
    <!-- do something in template1 !--> 
</xsl:template> 

<xsl:template match="*[local-name(.)='anotherchild1']" priority="0"> 
    <!-- do something in template2 !--> 
</xsl:template> 

例:

<a:root> 
    <b:child1> 
    <d:grandchildOfChild1> 
    </d:grandchildOfChild1> 
    </b:child1> 
    <c:child2> 
    <d:anotherchild1> 
     <d:grandchildOfAnotherChild1> 
     </d:grandchildOfAnotherChild1> 
    </d:anotherchild1> 
    </c:child2> 
</a:root> 

要件:

  • のみ 'child1のが' 存在している場合は、私は「grandchildOfChild1」で何かしたいです
  • 「anotherchild1」だけが存在する場合は、 'grandchildOfAnotherChild1'で何かを行うには
  • 'child1' & 'anotherchild1'が存在する場合は、 'child1'テンプレートだけが優先され、 'grandchildOfChild1'で何かしたいと思います。

上記のXSLは、#1、#2のために私に期待される結果が得られますが、両方が存在している、両方の場合テンプレートが一致しているとの両方の結果がレンダリングされます。どのように最初のものだけを取るようにするのですか?

+0

私には、質問は全く明確ではありません。あなたの入力に含まれるすべての要素を見ることができますが、あなたの説明はその存在の "条件付き"です。あなたはそれを言い換えることができますか? –

+1

これを解決しようとする前にやるべきことは、名前空間を正しく使う方法を学ぶことだと思います。それを行う方法を示しているので、ここに何十もの答えがあります。私はあなたの質問が完全に不明であることに同意します。実際の例と望ましい出力を見せてください。 – JLRishe

答えて

0

のみ「child1のが」存在している場合、私は で何かをしたい「grandchildOfChild1」

ここでは、その親child1は何の兄弟持っていないだけgrandchildOfChild1一致するテンプレートの例です:

<xsl:template match="child1[count(../*) = 1]/grandchildOfChild1"> 
    <!-- do something with 'grandchildOfChild1' --> 
</xsl:template> 

2番目の要件についても同じことができます。 'child1の' &もし


'anotherchild1は' 私が優先して 'grandchildOfChild1' で何かをするだけ 'child1の' テンプレートをしたい、存在しています。

この部分は不明です。私はあなたが別のテンプレートを持ちたいと思う

<xsl:template match="grandchildOfChild1"> 
    <!-- do something else with 'grandchildOfChild1' --> 
</xsl:template> 

上記のより具体的なテンプレートが適用できない場合、この状況は、行動にキックされます。

+0

ありがとう!私の#3要件は、両方の要素が入ってくるXML文書に存在する場合、最初のテンプレート上でのみ一致することです。たとえば、 'child1'& 'anotherchild1'が存在する場合、 'child1'と一致するテンプレートを優先して一致させたいだけです。 'anotherchld1'と一致するテンプレートは無視する必要があります。これがはっきりしていることを願っています。 – Preethi

+0

いいえ、私はまったく明らかではないと思います。 'child1'にマッチするいくつかのテンプレートを持ち、どのテンプレートが適用されるかを決める条件を指定することができます。 'anotherchild1'にマッチするテンプレートを' child1'にマッチさせるテンプレートをオーバーライドすることはできません。 –

関連する問題