Лучший и самый безопасный способ - отделить sch (schematron) от кода xslt. Держите sch-код внутри правила, и, если вам нужна xslt-функциональность, прервите вызов функции xslt-code, затем верните результат функции обратно в sch-код, и go on с sch- обработка.
Так коротко: Никогда не смешивайте sch и xslt в одном контексте программирования, и вы всегда будете в безопасности.
У меня есть пример, не берите в голову то, что он делает или для чего он , здесь, чтобы продемонстрировать, как разорвать sch-контекст для вызова некоторого xslt-кода, а затем вернуться обратно в sch-контекст:
<sch:pattern id="TPOD_0520">
<sch:rule context="//tekst:Hoofdstuk/tekst:Titel">
<sch:let name="APPLICABLE"
value="$SOORT_REGELING = $OP or $SOORT_REGELING = $OV or $SOORT_REGELING = $WV"/>
<sch:let name="hoofdstuk" value="string(../tekst:Kop/tekst:Nummer)"/>
<sch:let name="titel" value="string(tekst:Titel/tekst:Kop/tekst:Nummer)"/>
<!-- Below is the break-out to XSLT, and the value coming from the function is used in the sch-code -->
<sch:let name="volgorde" value="foo:volgordeTPOD_0520($titel, .)"/>
<sch:let name="CONDITION" value="string-length($volgorde) = 0"/>
<sch:assert test="($APPLICABLE and $CONDITION) or not($APPLICABLE)">
TPOD_0520: Als tussen Hoofdstuk en Afdeling Titel voorkomt dan moet de nummering van Afdelingen beginnen met het samengestelde nummer van de Titel waarin de Afdeling voorkomt, gevolgd door een punt. (betreft hoofdstukken, titels, afdelingen): <xsl:value-of select="$hoofdstuk"/>: <sch:value-of select="$titel"/>: <sch:value-of select="substring($volgorde,1,string-length($volgorde)-2)"/></sch:assert>
</sch:rule>
</sch:pattern>
<xsl:function name="foo:volgordeTPOD_0520">
<xsl:param name="titel" as="xs:string"/>
<xsl:param name="context" as="node()"/>
<xsl:variable name="volgorde">
<xsl:for-each select="$context/tekst:Afdeling">
<xsl:if test="not(string(tekst:Kop/tekst:Nummer)=concat($titel, '.', string(position())))">
<xsl:value-of select="concat(string(tekst:Kop/tekst:Nummer),', ')"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$volgorde"/>
</xsl:function>