2011-07-28 8 views
22

Mam następujące XML dosłowny:Warunkowo zawierać atrybut XML dosłownym

<input type='radio' 
     name={funcName} 
     value='true' /> 

chciałbym obejmują checked='checked' jeśli cond jest prawdą.

Próbowałem to,

<input type='radio' 
     name={funcName} 
     value='true' 
     { if (cond) "checked='checked'" else "" } /> 

ale to nie działa.

(ja bym naprawdę chciał uniknąć powtarzania cały tag).

+0

Możliwy duplikat [? W jaki sposób mogę dodać atrybut XML, lub nie, w zależności od Opcji] (http://stackoverflow.com/questions/4777971/how-do-i-add-an-xml-attribute-or-not-dependent-on-an-option) – Suma

Odpowiedz

29

Option działa również, co zmniejsza niepotrzebnego wykorzystywania null:

scala> val checked:Option[xml.Text] = None 
checked: Option[scala.xml.Text] = None 

scala> val xml = <input checked={checked} /> 
xml: scala.xml.Elem = <input ></input> 
+0

Piękne, dzięki! – aioobe

+2

Można również użyć 'opt.orNull', aby pominąć konwersję do' xml.Text'. – Tvaroh

+0

Uwaga: tylko Opcja [Tekst] działa, a nie Opcja [Ciąg]. – Suma

8

Jeśli chcesz tylko dodać atrybut, gdy zaznaczone, można go dodać po użyciu Scala XML API:

import scala.xml._ 

val snippet = { 

    val x = <input type='radio' 
       name={funcName} 
       value='true' /> 

    if(cond) { 
    x % new UnprefixedAttribute("checked","checked",Null) 
    } else x 

} 
8

Wierzcie lub nie, można to zrobić tak:

<input type='radio' 
     name={funcName} 
     value='true' 
     checked={ if (cond) "checked" else null } /> 

jest to jedna z ciemnych częściach Scala gdzie null akt ually zostaje wykorzystany.

Wystarczy, aby wyjaśnić, że robi dokładnie to, co chcesz: jeśli cond jest false, następnie input będzie miał niechecked atrybutu.

+0

wow, dziękuję! ... – aioobe

+1

Unikaj używania wartości null w wartościach atrybutów. Powoduje to sporą liczbę problemów w innych częściach bibliotek 2,8 XML. –

+0

@DavidPollak Czy na pewno? Podczas sprawdzania w konsoli wygląda na to, że atrybut nie jest w ogóle tworzony. – Suma