Polecenia warunkowe w xsl
Pracuję nad stroną, która niektóre if/or w XSL i będąc trochę nieznanym językiem nie jestem pewien, jak to zrobić:
If [condion one is meted] or [condion two is meted] then do [action] otherwise do [alternative action]
Czy ktoś może podać jakieś przykłady?
Z góry dzięki!
4 answers
Warunki w XSLT są albo jednoargumentowe "if":
<xsl:if test="some Boolean condition">
<!-- "if" stuff (there is no "else" here) -->
</xsl:if>
Lub bardziej jak polecenie switch w innych językach:
<xsl:choose>
<xsl:when test="some Boolean condition">
<!-- "if" stuff -->
</xsl:when>
<xsl:otherwise>
<!-- "else" stuff -->
</xsl:otherwise>
</xsl:choose>
Gdzie jest miejsce dla tylu <xsl:when>
s, ile chcesz.
Każde wyrażenie XPath może być ocenione jako Boolean zgodnie z zestawem reguł . Te (w przeważającej części) sprowadzają się do "jeśli jest coś -> true
" / "jeśli nie ma nic -> false
"
- pusty łańcuch to
false
- 0 jest
false
(tak jestNaN
) - pusty zestaw węzłów to
false
- wynikiem
false()
jestfalse
- każda inna literalna wartość to
true
(przede wszystkim:'false'
totrue
i'0'
totrue
) - wynik wyrażeń jest oceniany zgodnie z wymienionymi regułami (tutaj nic dziwnego)
Edit: istnieje oczywiście bardziej zaawansowana (i bardziej idiomatyczna) metoda kontrolowania przepływu programu, a to dopasowanie szablonu: {]}
<xsl:template match="node[contains(., 'some text')]">
<!-- output X -->
</xsl:template>
<xsl:template match="node[not(contains(., 'some text'))]">
<!-- output Y -->
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select=".//node" />
</xsl:template>
Pisanie szablonów, które pasują do konkretnych węzłów i użycie <xsl:apply-templates>
, aby procesor XSLT wybrał odpowiednie, jest lepsze od pisania złożonych konstrukcji <xsl:if>
lub <xsl:choose>
.
Powyższa próbka jest równoważna stylowi imperatywnemu:
<xsl:template match="/">
<xsl:for-each select=".//node">
<xsl:choose>
<xsl:when test="contains(., 'some text')">
<!-- output X -->
</xsl:when>
<xsl:when test="not(contains(., 'some text'))">
<!-- output Y -->
</xsl:when>
<xsl:choose>
<xsl:for-each>
</xsl:template>
Początkujący XSLT mają tendencję do wybierania tej drugiej formy ze względu na jej znajomość, ale sprawdzanie dopasowania szablonu zamiast używania warunków jest warte zachodu. (również zobacz.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:26
XSL ma <xsl:if>
, ale prawdopodobnie szukasz bardziej <xsl:choose>
/ <xsl:when>
/ <xsl:otherwise>
Sekwencja. Kilka przykładów tutaj (na dole). Może:
<xsl:choose>
<xsl:when test="[conditionOne] or [conditionTwo]">
<!-- do [action] -->
</xsl:when>
<xsl:otherwise>
<!-- do [alternative action] -->
</xsl:otherwise>
</xsl:choose>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-21 15:22:58
Ogólna składnia instrukcji if to
<xsl:if test="expression">
...some output if the expression is true...
</xsl:if>
Nie jestem pewien, czy xsl ma warunek else, ale powinieneś być w stanie przetestować if true, następnie test if false lub odwrotnie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-21 15:20:11
W tym przypadku trzeba by użyć xsl:choose
. To jak użycie if / else z finalnym else.
<xsl:choose>
<xsl:when test="condition one or condition two">
<!-- action -->
</xsl:when>
<xsl:otherwise>
<!-- alternative action -->
</xsl:otherwise>
</xsl:choose>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-21 15:16:35