2010-04-19 5 views
3

J'ai des problèmes avec le traitement XSL quand il y a des feuilles de style qui incluent relativement d'autres feuilles de style. (Les fichiers XML peuvent ne pas être pertinents, mais sont inclus pour être complets - le code est en bas).NSXMLDocument objectByApplyingXSLT avec XSL Include

Compte tenu du fichier XML:

<?xml version="1.0" ?> 
<famous-persons> 
<persons category="medicine"> 
    <person> 
    <firstname> Edward </firstname> 
    <name>  Jenner </name> 
    </person> 
</persons> 
</famous-persons> 

et le fichier XSL:

<?xml version="1.0" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:include href="included.xsl" /> 
</xsl:stylesheet> 

faisant référence à cette feuille de style dans le même répertoire appelé included.xsl:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:template match="/"> 
    <html><head><title>Sorting example</title></head><body> 
    </body></html> 
    </xsl:template> 
</xsl:stylesheet> 

comment puis-je faire en sorte que le fragment de code suivant:

NSError *lError = nil; 
NSXMLDocument *lDocument = [ [ NSXMLDocument alloc ] initWithContentsOfURL: 
             [ NSURL URLWithString: @"file:///pathto/data.xml" ] 
            options: 0 
            error: &lError ]; 

NSXMLDocument *lResult = [ lDocument objectByApplyingXSLTAtURL: [ NSURL URLWithString: @"file:///pathto/style.xsl" ] 
            arguments: nil 
            error: nil ]; 

ne me donne pas l'erreur:

I/O warning : failed to load external entity "included.xsl" 
compilation error: element include 
xsl:include : unable to load included.xsl 

J'ai essayé toutes sortes d'options. Le chargement de documents XML avec NSXMLDocumentXInclude ne semble pas non plus utile. La spécification du chemin absolu vers le fichier XSL à inclure fonctionne parfaitement.

Y at-il un moyen de rendre le traitement XSL de sorte qu'une feuille de style puisse inclure une autre feuille de style dans son chemin local?

Répondre

1

J'ai aussi eu ce problème. En fin de compte, j'ai écrit la classe SWXSLTransform qui est inclus dans mon cadre de SWXMLMapping: https://github.com/oriontransfer/SWXMLMapping

Le principal problème est que sous le capot, -[NSXMLDocument objectByApplyingXSLTAtURL:...] est en fait ne passe pas l'URL à libxslt. Au lieu de cela, il charge les données pointant sur cette URL et les transmet dans libxslt sans aucune URI de base. Pour cette raison, le répertoire de travail actuel devient l'URI de base - vous pouvez utiliser <xsl:include href="..."> où href est relatif au répertoire de travail courant ... Pas très utile! Pour autant que je sache, l'interface NSXMLDocument est complètement cassée, et il ne semble pas y avoir moyen de la réparer. J'ai déposé un rapport de bug.