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!

 19
Author: toomanyairmiles, 2009-07-21

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 jest NaN)
  • pusty zestaw węzłów to false
  • wynikiem false() jest false
  • każda inna literalna wartość to true (przede wszystkim: 'false' to true i '0' to true)
  • 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.)

 40
Author: Tomalak,
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>
 3
Author: Daniel F. Thornton,
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.

 1
Author: Flyer1,
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>
 0
Author: Zack The Human,
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