Применение функции element-available
Для проверки доступности элемента служит функция XSLT 1.0 element-available
. В следующем примере я проверяю наличие элемента с названием <starpowder:calculate>
:
<xsl:choose xmlns:starpowder='http://www.starpowder.com'>
<xsl:when test='element-available('starpowder:calculate')'>
<starpowder:calculate xsl:extension-element-prefixes='starpowder'/>
</xsl:when>
<xsl:otherwise>
<xsl:text>Sorry, can't do math today.</xsl:text>
</xsl:otherwise>
</xsl:choose>
Есть еще один способ обработать случай отсутствия элемента расширения — элемент <xsl:fallback>
.
Элемент <xsl:fallback>
При помощи элемента XSLT 1.0 <xsl:fallback>
можно указать, что следует делать в случае отсутствия элемента расширения. Этот элемент заключается в элемент расширения и используется в случае его недоступности.
У элемента <xsl:fallback>
нет атрибутов, он содержит тело шаблона.
В следующем примере я создам элемент <xsl:fallback>
внутри элемента <redirect:write>
из предыдущего примера. В случае отсутствия элемента <redirect:write>
элемент <xsl:fallback>
прекратит обработку и выдаст сообщение:
<xsl:stylesheet
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
version='1.0'
xmlns:lxslt='http://xml.apache.org/xslt'
xmlns:redirect='org.apache.xalan.lib.Redirect'
extension-element-prefixes='redirect'>
<lxslt:component prefix='redirect' elements='write open close' functions=''>
<lxslt:script lang='javaclass' src='org.apache.xalan.lib.Redirect'/>
</lxslt:component>
<xsl:output method='xml'/>
<xsl:template match='/'>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match='PLANETS'>
<redirect:write select='@file'>
<PLANETS>
<xsl:apply-templates/>
</PLANETS>
<xsl:fallback>
<xsl:message terminate='yes'>
<xsl:text>Could not create multiple output documents.</xsl:text>
</xsl:message>
</xsl:fallback>
</redirect:write>
</xsl:template>
<xsl:template match='@*|node()'>
<xsl:copy>
<xsl:apply-templates select='@*|node()'/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
На этом мы заканчиваем введение в работу с данными в документах XML. В следующей главе мы разберем эту тему и узнаем, как изменять содержимое документа и создавать новые элементы, атрибуты и инструкции обработки.
Глава 6
Преобразование в XML, HTML, XHTML, RTF
Предположим, web-узел вашей компании использует основанное на XML программное обеспечение фирмы Commerce One, в котором для безопасной коммуникации через Интернет применяется Java Message Service (JMS). Ваша деятельность была настолько успешной, что вы только что поглотили своего конкурента. К сожалению, для своего узла в Интернете ваш бывший конкурент использует другой основанный на XML продукт, RosettaNet. Как вам теперь преобразовать заказ на покупку xCBL Commerce One, написанный на XML, в заказ на покупку RosettaNet, также написанный на XML, но совершенно на другом диалекте?
Разумеется, применить XSLT. Такого рода XML-XML преобразования становятся все более и более распространенными. Все больше компаний применяют JMS для безопасных коммуникаций через Интернет, и поскольку JMS выполняется в Java, будет разумным связать JMS с основанными на Java процессорами XSLT, такими, как Xalan или Saxon.
В этой книге мы уже рассматривали преобразование XML в HTML, XML и простой текст, но в текущей главе сделаем это более подробно. Мы также рассмотрим здесь новый тип преобразования — из XML в JavaScript. В главе 10 мы познакомимся с преобразованиями из XML в базу данных на основе SQL, а в главе 11 — с преобразованиями из XML в XSL-FO.
Основная задача XSLT состоит не просто в замене одного элемента на другой, но в полной реорганизации содержимого XML-документа. Например, вам может потребоваться реорганизовать planets.xml
в терминах плотности планет при помощи XSLT для создания нового XML- документа:
<?xml version='1.0' encoding='UTF-8'?>
<DATA>
<DENSITY>