2017-02-17 13 views
0

XSL:XSLT 1.0: Матч только один из двух шаблонов на основе старшинства

<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», я хочу t сделать что-то с 'grandchildOfAnotherChild1'
  • Если «child1» & 'anotherchild1' присутствуют, я хочу, чтобы шаблон 'child1' имел приоритет и что-то делал с помощью 'grandchildOfChild1'.

Вышеупомянутый XSL дает мне ожидаемые результаты для # 1, # 2, но если оба они присутствуют, оба шаблона согласованы и оба результата отображаются. Как заставить его взять только первый?

+0

У меня вопрос не совсем понятен. Я могу видеть все элементы вашего ввода, но ваше объяснение «условно» от их присутствия. Вы можете перефразировать его, пожалуйста. –

+1

Я думаю, что прежде чем пытаться решить это, нужно научиться правильно использовать пространства имен. Здесь есть десятки ответов на SO, показывающие, как это сделать. Я также согласен с тем, что ваш вопрос совершенно неясен. Пожалуйста, покажите нам пример реального мира и желаемый результат. – JLRishe

ответ

0

Если только «child1» присутствует, я хочу сделать что-то с «grandchildOfChild1»

Вот пример шаблона, который соответствует grandchildOfChild1 только тогда, когда его родитель child1 не имеет братьев и сестер:

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

Вы можете сделать то же самое для своего второго требования.


Если 'child1' & 'anotherchild1' присутствует, я хочу только 'child1' шаблона иметь приоритет и делать что-то с 'grandchildOfChild1.

Эта часть непонятна. Я думаю, что вы хотите иметь другой шаблон:

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

Это пнуть в действие, когда более конкретный шаблон выше неприменим.

+0

Спасибо! Мое требование № 3 должно соответствовать только по первому шаблону, когда оба элемента присутствуют во входящем XML-документе. В качестве примера, если присутствует «child1» и «anotherchild1», я хочу, чтобы шаблон, соответствующий «child1», имел приоритет и был только согласован. Шаблон для соответствия 'anotherchld1' должен быть проигнорирован. Надеюсь, что это понятно. – Preethi

+0

Нет, я боюсь, что это совсем не ясно. Вы можете иметь несколько шаблонов, соответствующих 'child1', и указать условия, определяющие, какой из них будет применяться, когда. Вы не можете иметь шаблон, соответствующий 'child1', переопределить шаблон, соответствующий' anotherchild1'. –

Смежные вопросы