Вы могли бы сделать это с небольшим количеством мета-XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="xsl:call-template">
<xsl:variable name="template" select="/xsl:stylesheet/xsl:template[@name=current()/@name]"/>
<xsl:variable name="call" select="." />
<xsl:variable name="desc">
<xsl:value-of select="concat('call to named template "',$template/@name,'" in ')"/>
<xsl:choose>
<xsl:when test="ancestor::xsl:template/@name">
<xsl:value-of select="concat('named template "',ancestor::xsl:template/@name,'"')" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat('template matching "',ancestor::xsl:template/@match,'"')" />
</xsl:otherwise>
</xsl:choose>
<xsl:text> </xsl:text>
</xsl:variable>
<xsl:for-each select="$template/xsl:param[not(@select)]">
<xsl:if test="not($call/xsl:with-param[@name=current()/@name])">
<xsl:value-of select="concat('Missing parameter "',@name,'" in ',$desc)" />
</xsl:if>
</xsl:for-each>
<xsl:for-each select="xsl:with-param">
<xsl:if test="not($template/xsl:with-param[@name=current()/@name])">
<xsl:value-of select="concat('Unrecognised parameter "',@name,'" in ',$desc)" />
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
Эта таблица стилей берет любую таблицу стилей в качестве входных данных и проверяет, что все шаблоны вызовов имеют правильные параметры, выводя сообщение при наличии ошибок.
Это, очевидно, не будет помещать проверку ошибок в сам преобразователь, но будет перечислять ВСЕ ошибки за один раз и потенциально может быть расширен для проверки других проблем.
РЕДАКТИРОВАТЬ: я адаптировал его для обработки необязательных параметров, и добавил средства для описания, где ошибка; на самом деле это немного редизайн, с необязательными параметрами, просто подсчитать их будет сложно, поэтому я удалил этот бит. В любом случае, все ошибки детализированы, поэтому подсчет не был действительно необходим.