2017-02-17 2 views
0

XSL:XSLT 1.0: Match nur eine der beiden Vorlagen basierend auf Vorrang

<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> 

Beispiel:

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

Anforderungen:

  • Wenn nur 'child1' vorhanden ist, Ich möchte etwas mit 'grandchildOfChild1' machen
  • Wenn nur 'anotherchild1' vorhanden ist, ich wan t, um etwas mit 'enkindOfAnotherChild1' zu tun
  • Wenn 'child1' & 'anotherchild1' vorhanden sind, möchte ich nur 'child1' Vorlage Vorrang haben und etwas mit 'grandchildOfChild1' tun.

Die obige XSL ergibt me die erwarteten Ergebnisse für # 1, # 2, aber wenn beide vorhanden sind, die beide die Vorlagen angepasst sind und sowohl die Ergebnisse wiedergegeben werden. Wie schaffe ich es, nur die erste zu nehmen?

+0

Für mich ist die Frage überhaupt nicht klar. Ich kann alle Elemente in Ihrer Eingabe sehen, aber Ihre Erklärung ist "bedingt" von ihrer Anwesenheit. Kannst du es bitte umformulieren? –

+1

Ich denke, die Sache zu tun, bevor Sie versuchen, dies zu lösen, ist zu lernen, wie man Namespaces korrekt verwendet. Es gibt Dutzende Antworten hier auf SO, die zeigen, wie man das macht. Ich stimme auch zu, dass Ihre Frage völlig unklar ist. Bitte zeigen Sie uns ein reales Beispiel und die gewünschte Ausgabe. – JLRishe

Antwort

0

Wenn nur ‚child1‘ vorhanden ist, möchte ich

Hier ist ein Beispiel der Vorlage etwas mit ‚grandchildOfChild1‘ tun, die grandchildOfChild1 nur übereinstimmt, wenn seine Eltern child1 keine Geschwister hat:

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

Sie können das gleiche für Ihre zweite Anforderung tun.


Wenn 'child1' & 'anotherchild1' vorhanden sind, möchte ich nur 'child1' Vorlage Vorrang zu nehmen und etwas zu tun mit 'grandchildOfChild1'.

Dieser Teil ist nicht klar. Ich denke, Sie eine andere Vorlage haben möchten:

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

Dies wird in Aktion treten, wenn die speziellere Vorlage oben nicht anwendbar ist.

+0

Danke! Meine # 3-Anforderung besteht darin, nur über die erste Vorlage zu passen, wenn beide Elemente im eingehenden XML-Dokument vorhanden sind. Wenn beispielsweise 'child1' und 'anotherchild1' vorhanden sind, möchte ich, dass die Vorlage, die 'child1' entspricht, Vorrang hat und nur abgeglichen wird. Die Vorlage für 'anotherchld1' sollte ignoriert werden. Hoffe, das ist klar .. – Preethi

+0

Nein, ich fürchte, es ist überhaupt nicht klar. Sie können mehrere Vorlagen haben, die mit "child1" übereinstimmen, und die Bedingungen festlegen, die festlegen, welche Anwendung wann angewendet wird. Sie können nicht verhindern, dass eine Vorlage, die "child1" entspricht, eine Vorlage überschreibt, die "anotherchild1" entspricht. –

Verwandte Themen