Выбрать главу

 .

 .

 .

Вот как происходит обработка примера в Xalan:

C:\planets>java org.apache.xalan.xslt.Process -IN planets.xml -XSL errors.xsl -OUT new.xml

file:///C:/XSL/w.xsclass="underline" Line 18: Column 38: Each planet must have a name!

XSLT Error (javax.xml.transform.TransformerException): Stylesheet directed termination

Если вы знакомы с конструкцией if в языках программирования, вы знаете, что инструкция if обычно сопровождается инструкцией else, которая выполняется при ложности условия в if. Но в XSLT нет элемента <xsclass="underline" else>. Для задания альтернативных ветвей выполнения XSLT служит элемент <xsclass="underline" choose>.

Элементы <xsclass="underline" choose>, <xsclass="underline" when> и <xsclass="underline" otherwise>

Элемент <xsclass="underline" choose> похож на оператор Java switch, который позволяет сравнивать значение условия с несколькими возможными вариантами.

У элемента <xsclass="underline" choose> нет атрибутов. Он содержит один или более элементов <xsclass="underline" when> и (не обязательно) один элемент <xsclass="underline" otherwise>, который в случае применения должен стоять последним.

Вот как это работает: в элемент <xsclass="underline" choose> заключаются элементы <xsclass="underline" when>, каждый с условием true/false. Применяется тело шаблона в первом элементе <xsclass="underline" when>, чье условие имеет значение true, все остальные не применяются. Последним элементом внутри элемента <xsclass="underline" choose> может быть элемент <xsclass="underline" otherwise> тело шаблона внутри этого элемента применяется, если ни одно из предыдущих условий <xsclass="underline" when> не имело значения true:

<xsclass="underline" choose>

 <xsclass="underline" when test="expression1">

  <!--template-body 1-->

 </xsclass="underline" when>

 <xsclass="underline" when test="expression">

  <!-- template-body 2-->

 </xsclass="underline" when>

 <xsclass="underline" when test="expression3">

  <!--template-body 3-->

 </xsclass="underline" when>

 <xsclass="underline" otherwise>

  <!--template body 4-->

 </xsclass="underline" otherwise>

</xsclass="underline" choose>

В предыдущем разделе для осуществления этого преобразования нам потребовалось три элемента <xsclass="underline" if>:

<?xml version="1.0"?>

<xsclass="underline" stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsclass="underline" output method="xml"/>

 <xsclass="underline" template match="PLANETS">

  <DOCUMENT>

   <TITLE>

    The Planets

   </TITLE>

   <PLANETS>

    The first three planets are: <xsclass="underline" apply-templates select="PLANET"/>

   </PLANETS>

  </DOCUMENT>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET">

  <xsclass="underline" if test="NAME[not(text())]">

   <xsclass="underline" message terminate="yes">

    Each planet must have a name!

   </xsclass="underline" message>

  </xsclass="underline" if>

  <xsclass="underline" value-of select="NAME"/>

  <xsclass="underline" if test="position()!=last()">, </xsclass="underline" if>

  <xsclass="underline" if test="position()=last()-1>and </xsclass="underline" if>

  <xsclass="underline" if test="position()=last()">.</xsclass="underline" if>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Теперь то же самое можно сделать при помощи единственного элемента <xsclass="underline" choose>:

<?xml version="1.0"?>

<xsclass="underline" stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xmclass="underline" output method="xml"/>

 <xsclass="underline" template match="PLANETS">

  <DOCUMENT>

   <TITLE>

    The Planets

   </TITLE>

   <PLANETS>

    The first three planets are: <xsclass="underline" apply-templates select="PLANET"/>

   </PLANETS>

  </DOCUMENT>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET">

  <xsclass="underline" if test="NAME[not(text())]">

   <xsclass="underline" message terminate="yes">

    Each planet must have a name!

   </xsclass="underline" message>

  </xsclass="underline" if>

  <xsclass="underline" value-of select="NAME"/>

  <xsclass="underline" choose>

   .

   .

   .

  </xsclass="underline" choose>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Нам нужно проверить, в каком месте документа мы находимся, при помощи включения нескольких элементов <xsclass="underline" when>. У этого элемента только один атрибут:

• test (обязательный). Принимает логическое (Boolean) значение (true/false) проверяемого условия.

Элемент <xsclass="underline" when> содержит тело шаблона.

Атрибут проверки принимает значение true/false выражения, определяющего, будет ли применяться заключенное в элементе <xsclass="underline" when> тело шаблона или нет. Например, вот как я добавил элементы <xsclass="underline" when> с соответствующими знаками пунктуации для всех планет, кроме последней:

<?xml version="1.0"?>

<xsclass="underline" stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsclass="underline" output method="xml"/>

 <xsclass="underline" template match="PLANETS">

  <DOCUMENT>

   <TITLE>

    The Planets

   </TITLE>

   <PLANETS>

    The first three planets are: <xsclass="underline" apply-templates select="PLANET"/>

   </PLANETS>

  </DOCUMENT>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET">

  <xsclass="underline" if test="NAME[not(text())]">

   <xsclass="underline" message terminate="yes">

    Each planet must have a name!

   </xsclass="underline" message>

  </xsclass="underline" if>

  <xsclass="underline" value-of select="NAME"/>

  <xsclass="underline" choose>

   <xsclass="underline" when test="position()!=last()">, </xsclass="underline" when>

   <xsclass="underline" when test="position()=last()-1">and </xsclass="underline" when>

   .

   .

   .

  </xsclass="underline" choose>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Эти два элемента <xsclass="underline" when> выбирают все элементы <PLANET> за исключением последнего, поэтому элемент <xsclass="underline" otherwise> можно применить для последнего элемента <PLANET>. Тело шаблона в этом элементе будет применено, если ни в одном элементе <xsclass="underline" when> в элементе <xsclass="underline" choose> условие не примет значение true.