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

  <TD>

   <FONT COLOR="{$COLOR}"><xsclass="underline" apply-templates select="MASS"/></FONT>

  </TD>

  <TD>

   <FONT COLOR="{$COLOR}"><xsclass="underline" apply-templates select="RADIUS"/></FONT>

  </TD>

  <TD>

   <FONT COLOR="{$COLOR}"><xsclass="underline" apply-templates select="DAY"/></FONT>

  </TD>

 </TR>

</xsclass="underline" template>

Как задавать значения шаблона в командной строке

Кроме возможностей, предоставляемых элементами <xsclass="underline" param> и <xsclass="underline" with-param>, значение параметров таблицы стилей во многих процессорах XSLT можно также задавать в командной строке. Способ зависит от конкретного процессора.

Следующий пример показывает, как можно присвоить параметру param1 значение value1 в командной строке, используя процессор XSLT от Oracle в Windows. Заметьте, что при установке значений параметра в командной строке его все равно нужно объявлять в таблице стилей при помощи <xsclass="underline" param>:

C:\>java oraclе.xml.parser.v2.oraxsl -p param1='value1' planets.xml planets.xsl output.xml

Вот как то же самое можно сделать при помощи Saxon:

C:\>saxon source.xml stylesheet.xsl param1=value1 > output.xml

при помощи Xalan:

C:\>java org.apache.xalan.xslt.Process -IN planets.xml -XSL planets.xsl -OUT output.xml -PARAM parma1 value1

и XT:

C:\XSL>java -Dcom jclark.xsl.sax parser=org.apache.xerces.parsers.SAXParser.com.jclark.xsl.sax.Driver planets.xml planets.xsl output.xml param1=value1

Элемент <xsclass="underline" key>: выбор по ключу 

Элемент <xsclass="underline" key> позволяет создать ключ и выбрать узлы по этому ключу. Он обладает следующими атрибутами:

• name (обязательный). Имя ключа, устанавливается в QName;

• match (обязательный). Устанавливается в образец выбора для выбора узлов, к которым применяется ключ;

• use (обязательный). Устанавливается в выражение, определяющее значение ключа.

При помощи ключей можно легко распознавать элементы; конкретные ключи можно выбрать при помощи образца «key()». В главе 4 мы познакомились с ключами, имеющими одно значение. В следующем примере я использую ключи для выбора планет, у которых атрибут COLOR был установлен в «BLUE» — в данном случае это Земля:

<?xml version="1.0"?>

<?xml-stylesheet type="text/xml" href="planets.xsl"?>

<PLANETS>

 .

 .

 .

 <PLANET COLOR="BLUE">

  <NAME>Earth</NAME>

  <MASS UNITS="(Earth = 1)">1</MASS>

  <DAY UNITS="days">1</DAY>

  <RADIUS UNITS="miles">2107</RADIUS>

  <DENSITY UNITS="(Earth = 1)">1</DENSITY>

  <DISTANCE UNITS="million miles">128.4</DISTANCE><!--B перигелии-->

 </PLANET>

</PLANETS>

Я создал ключ COLOR, выбирающий элементы <PLANET> путем проверки их атрибута COLOR. Ключ выглядит следующим образом:

<?xml version="1.0"?>

<xsclass="underline" stylesheet version="1.1"

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

 <xsclass="underline" key name="COLOR" match="PLANET" use="@COLOR"/>

 .

 .

 .

После этого я применил образец «key()» для того, чтобы выбрать элементы <PLANET>, у которых атрибут COLOR установлен в «BLUE»:

<?xml version="1.0"?>

<xsclass="underline" stylesheet version="1.1"

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

 <xsclass="underline" key name="COLOR" match="PLANET" use="@COLOR"/>

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

  <HTML>

   <HEAD>

    <TITLE>

     The Planets Table

    </TITLE>

   </HEAD>

   <BODY>

    <H1>

     The Planets Table

    </H1>

    <TABLE BORDER="2">

     <TR>

      <TD>Name</TD>

      <TD>Mass</TD>

      <TD>Radius</TD>

      <TD>Day</TD>

     </TR>

     <xsclass="underline" apply-templates select="key('COLOR', 'BLUE')"/>

    </TABLE>

   </BODY>

  </HTML>

 </xsclass="underline" template>

 .

 .

 .

И вот результат — как видите, образцу удовлетворяет только Земля:

<HTML>

 <HEAD>

  <TITLE>

   The Planets Table

  </TITLE>

 </HEAD>

 <BODY>

  <H1>

   The Planets Table

  </H1>

  <TABLE BORDER="2">

   <TR>

    <TD>Name</TD>

<TD>Mass</TD>

    <TD>Radius</TD>

    <TD>Day</TD>

   </TR>

   <TR>

    <TD>Earth</TD>

    <TD>1 (Earth = 1)</TD>

    <TD>2107 miles</TD>

    <TD>1 days</TD>

</TR>

  </TABLE>

 </BODY>

</HTML>

Но в данном случае существует больше вариантов. Например, ключу могут соответствовать несколько узлов, а это означает, что использующий ключ образец вернет набор узлов. Пусть, например, все планеты будут иметь одно и то же значение атрибута COLOR, «UNKNOWN» (неизвестен):

<?xml version="1.0"?>

<?xml-stylesheet type="text/xml" href="planets.xsl"?>

<PLANETS>

 <PLANET COLOR="UNKNOWN">

  <NAME>Mercury</NAME>

  <MASS UNITS="(Earth = 1)">.0553</MASS>

  <DAY UNITS="days">58.65</DAY>

  <RADIUS UNITS="miles">1516</RADIUS>

  <DENSITY UNITS="(Earth = 1)">.983</DENSITY>

  <DISTANCE UNITS="million miles">43.4</DISTANCE><!--B перигелии-->

 </PLANET>

 <PLANET COLOR="UNKNOWN">

  <NAME>Venus</NAME>

  <MASS UNITS="(Earth = 1)">.815</MASS>