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