2013-10-25 6 views
3

У меня есть этот XSLT 2.0 шаблон:XSLT Множественные условия

<xsl:template match="para[ 
    not(ancestor::p) 
    and not(ancestor::div) 
    and not(ancestor::paragraph) 
    ]"> 
    <p class="para"> 
     <xsl:apply-templates/> 
    </p> 
</xsl:template> 

Он делает то, что мне нужно сделать: это предотвращает HTML <p> в <p>. Но это многословно, и я полагаю, что есть более сжатый способ написать его.

Есть ли лучший способ написать несколько предковых тестов? Я попробовал союз ... это не сработало, конечно.

ответ

2
<xsl:template match="para[not(ancestor::p|ancestor::div|ancestor::paragraph)]"> 
    <p class="para"> 
     <xsl:apply-templates/> 
    </p> 
</xsl:template> 

В качестве альтернативы

<xsl:template match="para"> 
    <p class="para"> 
     <xsl:apply-templates/> 
    </p> 
</xsl:template> 

<xsl:template match="para[ancestor::p|ancestor::div|ancestor::paragraph]" /> 
<!-- or whatever you want to do in that case, <xsl:apply-templates/> maybe --> 
+1

+1. Во втором случае было бы полезно объяснить, что второй шаблон имеет более высокий неявный приоритет из-за специфики его шаблона соответствия. Однако это вводит скрытые зависимости, которые могут быть легко сломаны позже, например. если по какой-то причине кому-то нужно изменить шаблон 'match =" para ". Моя рекомендация при использовании приоритетов шаблонов - сделать их явными, используя атрибут 'priority ='. – LarsH

+0

@LarsH Мне немного надоело объяснять специфику выражения выражения, но да, вы правы. Также с вашим вторым моментом, который является проблемой, присущей любому черному списку/whitelisting. До определенной сложности трансформации он оставался бы управляемым, в какой-то момент он может привести к неожиданному поведению. – Tomalak

+0

Я согласен с вами. Помимо сложности, это также зависит от количества людей в проекте, их уровня опыта в XSLT и т. Д. Я бы не сказал эксперту, делающему личный проект, что ему следует избегать использования неявного приоритета. Но я думаю, что при введении решения, которое опирается на него, тому, кто может не знать, важно знать, что проблема существует. Затем они могут принять обоснованное решение. Что делает этот случай заслуживающим особого внимания, так это то, что если возникает ошибка, очень сложно понять, почему, если вы не знаете механизм приоритета по умолчанию. – LarsH

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