2014-06-19 3 views
1

J'ai un fichier schematron qui contient la fonction xsl.schematron localfunctions donne une erreur

Je reçois cette erreur: "la fonction functionName n'a pas été trouvée dans l'espace de noms localFunctions"

Voici mes codes Schematron:

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://purl.oclc.org/dsdl/schematron" 
    xmlns:sch="http://purl.oclc.org/dsdl/schematron" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fct="localFunctions" 
    queryBinding="xslt2" > 

<ns prefix="gl-plt" uri="http://www.xbrl.org/int/gl/plt/2010-04-16" /> 
<ns prefix="gl-cor" uri="http://www.xbrl.org/int/gl/cor/2006-10-25" /> 
<ns prefix="gl-bus" uri="http://www.xbrl.org/int/gl/bus/2006-10-25" /> 
<ns prefix="xbrli" uri="http://www.xbrl.org/2003/instance" /> 
<ns prefix="edefter" uri="http://www.edefter.gov.tr" /> 
<ns prefix="fct" uri="localFunctions" /> 

<title></title> 

<!-- <gl-cor:accountingEntries> elemanı bir <gl-cor:entityInformation> elemanı içermelidir. --> 
<pattern id="accountingentries"> 
    <rule context="/edefter:defter/xbrli:xbrl/gl-cor:accountingEntries"> 
     <let name="accoundMainIdList" value="gl-cor:entryHeader/gl-cor:entryDetail[1]/gl-cor:account/normalize-space(gl-cor:accountMainID)"/> 
     <assert test="fct:isSorted($accoundMainIdList)">Büyük defterde hesaplar, ana hesap numarası bazında sıralı olmalıdır.</assert> 
    </rule>   
</pattern> 

<xsl:function name="fct:isSorted" as="xs:boolean"> 
<xsl:param name="accoundMainIdList" as="xs:string*"/> 
<xsl:variable name="sortedAccountMainIdList" as="xs:string*"> 
    <xsl:for-each select="$accoundMainIdList"> 
    <xsl:sort/> 
    <xsl:value-of select="."/> 
    </xsl:for-each> 
</xsl:variable> 
<xsl:variable name="s1"> 
    <xsl:value-of select="string-join($accoundMainIdList,'|')"/> 
</xsl:variable> 
<xsl:variable name="s2"> 
    <xsl:value-of select="string-join($sortedAccountMainIdList,'|')"/> 
</xsl:variable> 
<xsl:choose> 
    <xsl:when test="$s1 = $s2"> 
    <xsl:value-of select="true()"/> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:value-of select="false()"/> 
    </xsl:otherwise> 
</xsl:choose> 
</xsl:function> 

</schema> 

Pourquoi la fonction IsSorted xsl ne se trouve pas dans l'espace de noms?

+0

Comment exécutez-vous le Schematron, quelle implémentation utilisez-vous? –

+0

Est-ce le message d'erreur littéral que vous recevez? Il fait référence à 'functionName' et non à 'isSorted' ?? – kjhughes

+0

Message d'erreur réel est "la fonction isSorted n'a pas été trouvé dans namespace localFunctions" J'utilise XRouters SchemaTron dont je télécharge les exemples de code de https://github.com/gap777/SchemaTron – zeynep

Répondre

2

Je suppose que vous êtes conscient que la méthode classique d'exécution de schémas Schematron consiste à les traiter en utilisant XSLT pour générer une feuille de style XSLT qui peut être exécutée sur votre instance XML.

En regardant sur github, les projets XRouters Schematron utilisent une très ancienne version des feuilles de style XSLT standard de http://www.schematron.com/. Ce sont des feuilles de style XSLT 1.0 et ne sont pas capables de générer des feuilles de styles XSLT 2.0. L'élément xsl:function que vous essayez d'utiliser fait partie de XSLT 2.0. Étant donné que votre outil génère XSLT 1.0, il semble très improbable que votre fonction XSLT 2.0 fonctionne.

Si vous voulez essayer une approche qui peut avoir plus de succès, je vous suggère d'obtenir une copie de Saxon HE (la version .net) de http://saxon.sf.net/. Vous pouvez ensuite créer un ensemble simple de transformations XSLT qui vous donnera plus de chance d'obtenir ce que vous voulez.

+0

Merci beaucoup :) Il a résolu tous mes problèmes – zeynep

0

Je pense que la réponse de Nic est dans la bonne direction, mais a raté la cible. Bien que la manière standard d'exécuter des schémas schematron sur des documents XML consiste à les convertir en XSLT, cette approche présente un certain nombre d'inconvénients (la vitesse et le rapport de validation que vous pouvez traiter par programme sont deux principaux). Le XRouter SchemaTron est une implémentation .NET native de ISO schematron.

Il ne convertit pas les schémas schematron en feuilles de style XSLT - il les analyse en mémoire, puis traite chaque pattern/rule/assert pour détecter les violations.

Le problème est certainement lié à un manque de support XSLT2, mais n'est pas du tout lié aux feuilles de style schematron XSLT (elles ne sont pas utilisées et sont incluses dans le projet uniquement comme référence). La spécification Schematron ne nécessite pas XSLT2 (ou XPATH2) - elle laisse le langage de requête dans le fichier de règles schematron. La branche que vous utilisiez était probablement celle qui supportait XPATH2 via "Lightweight XPath2 for .NET", qui ne supporte pas XSLT2.

Je recommande d'utiliser la branche du projet intégré avec XmlPrime, avec des supports XSLT2. Nous utilisons cette version avec beaucoup de succès.