2014-02-18 4 views
4

Я использую xsl:if для выполнения небольшого условия в более крупном блоке xsl:template, и я бы хотел проверить равенство атрибута текущего сопоставленного узла xsl:template.XSLT if - attribute равно string

Следующая не работает:

<xsl:template match="sometag[@type='sometype']"> 
    ==Sometag== 
    <xsl:if test="@something!='hidden'">something</xsl:if> 
    <!--a lot of other stuff that I don't want to duplicate by multiplying the xsl:templates--> 
<xsl:template> 

Этот тест, кажется, всегда вычисляемая ложь, может быть, я не имею хороший синтаксис?

Этот XML:

<sometag type="sometype" something="visible"/> 
<sometag type="sometype" something="hidden"/> 
<sometag type="sometype"/> 

должны дать

==Sometag== 
something... 
==Sometag== 
==Sometag== 
something... 
+0

Возможно, есть более эффективные способы организации вашей таблицы стилей. Пожалуйста, покажите свой XML-входной файл и больше контекста XSLT (если не всю таблицу стилей). –

+0

@ MathiasMüller Я показал пример XML и то, что мне бы хотелось: 2-й тэг не должен печатать «что-то». И, пожалуйста, ответьте на вопрос 'xsl: if'. Мой XSLT намного больше, и я бы хотел использовать тег 'xsl: if', а не реорганизовывать все. – lajarre

+0

Синтаксис выглядит хорошо. Угадайте, что этот шаблон не выполнен, или некоторые предыдущие вещи XSLT. Пожалуйста, укажите полный XSLT ... –

ответ

8

2-й тег не должен получить "что-то" часть распечатана.

Я не совсем уверен, чего вы пытаетесь достичь, но я попробую.

Один из ваших элементов sometag не имеет атрибута something. Не имеющий этого атрибута полностью отличается от @something!='hidden'. Итак, строка «something» не выводится, если атрибут something отсутствует.

Из-за этого вам нужно проверить, есть ли это атрибут something до вашего xsl:if состояния оценивается.

Входной

<?xml version="1.0" encoding="utf-8"?> 
<root> 
<sometag type="sometype" something="visible"/> 
<sometag type="sometype" something="hidden"/> 
<sometag type="sometype"/> 
</root> 

стилевых

<?xml version="1.0" encoding="utf-8"?> 

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/root"> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="sometag[@type='sometype']"> 
     <xsl:text>==Sometag==</xsl:text> 
     <xsl:choose> 
     <xsl:when test="@something"> 
      <xsl:if test="@something!='hidden'"> 
       <xsl:text>something</xsl:text> 
      </xsl:if> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:text>something</xsl:text> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

EDIT C @ Тим предложил еще более короткая версия:

<xsl:template match="sometag[@type='sometype']"> 
    <xsl:text>==Sometag==</xsl:text> 
    <xsl:if test="@something!='hidden' or not(@something)"> 
     <xsl:text>something</xsl:text> 
    </xsl:if> 
</xsl:template> 

Выходные

==Sometag==something==Sometag====Sometag==something 
1

Исходя из вышеуказанного раствора (из @Mathias Мюллером и как это было предложено @ Тим C) вы можете даже ускорить вещи немного с помощью Short-Circuit Evaluation для or:

<xsl:template match="sometag[@type='sometype']"> 
    <xsl:text>==Sometag==</xsl:text> 
    <xsl:if test="not(@something) or @something!='hidden'"> 
     <xsl:text>something</xsl:text> 
    </xsl:if> 
</xsl:template> 

Если атрибут something отсутствует, то предложение if уже оценивается до true, и выражение @something!='hidden' не нужно оценивать.

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