XSLT уже имеет функцию для запуска различных инструкций в зависимости от содержимого вашего входного документа: шаблоны .Я считаю, что слишком сложно работать с внутренним API Saxon, если вы уже используете XSLT, просто скомпилируйте этот большой XSLT один раз и используйте его снова.
Просто найдите время, чтобы познакомиться с XSLT, и этофункциональный характер и преобразовать эти функции в шаблоны с правильным выражением match
.
Я приведу пример.Давайте предположим, что у нас есть два входных XML:
<myxml>
<doctype>recipe</doctype>
<descr>Bread 'n jam sandwich</descr>
<var>jam</var>
<var>bread</var>
</myxml>
<myxml>
<doctype>shoppinglist</doctype>
<descr>Monday</descr>
<var>honey</var>
<var>butter</var>
<var>loaf of bread</var>
<var>jam</var>
</myxml>
Теперь предположим, что мы хотим сгенерировать HTML для этих XML с правильным форматированием.Первый XML должен генерировать HTML с «Recipe:» и списком ингредиентов.Второй должен содержать список покупок.
Вот XSLT для генерации обоих:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:saxon="http://saxon.sf.net/"
exclude-result-prefixes="xs saxon">
<xsl:output method="html" indent="yes"/>
<!-- Generate basic html -->
<xsl:template match="/">
<html>
<body><xsl:apply-templates /></body>
</html>
</xsl:template>
<!-- Only call template doctype element, not for vars -->
<xsl:template match="myxml">
<xsl:apply-templates select="doctype"/>
</xsl:template>
<xsl:template match="doctype[.='shoppinglist']">
<h1>Shopping list for <xsl:value-of select="../descr"/></h1>
<span><b>Stuff to bring:</b></span>
<ul>
<xsl:for-each select="../var">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
</xsl:template>
<xsl:template match="doctype[.='recipe']">
<h1>Recipe: <xsl:value-of select="../descr"/></h1>
<span><b>Ingredients:</b></span>
<ul>
<xsl:for-each select="../var">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
</xsl:template>
</xsl:stylesheet>
Теперь рассмотрим аргумент match
последних шаблонов.В этом случае я выбрал на основе содержимого элемента, но вы можете просто использовать любое выражение фильтра XPath, которое вам нравится (т.е. выбирать на основе аргумента XML).