2010-05-01 1 views
1

J'essaie de faire correspondre certains éléments en utilisant XSLT. Mon document d'entrée est très volumineux et le code source source ne se charge pas après le traitement du code suivant (en particulier la première ligne).Impossible de charger un document XML énorme (supposer à tort que cela est dû au traitement XSLT)

<xsl:template match="XMI/XMI.content/Model_Management.Model/Foundation.Core.Namespace.ownedElement/Model_Management.Package/Foundation.Core.Namespace.ownedElement"> 
    <rdf:RDF> 
     <rdf:Description rdf:about=""> 

      <xsl:for-each select="Foundation.Core.Class">  
       <xsl:for-each select="Foundation.Core.ModelElement.name"> 
        <owl:Class rdf:ID="@Foundation.Core.ModelElement.name" /> 
       </xsl:for-each> 
      </xsl:for-each>  

     </rdf:Description> 
    </rdf:RDF> 
</xsl:template> 

Apparemment, le XSLT ne parvient pas à charger après "Model_Management.Model". Le code PHP est la suivante:

if ($xml->loadXML($source_xml) == false) { 
    die('Failed to load source XML: ' . $http_file); 
} 

Il ne parvient pas à effectuer loadXML et meurt immédiatement. Je pense qu'il y a deux options maintenant.

1) Je devrais définir une durée d'exécution maximale. Franchement, je ne sais pas comment je fais cela pour le processeur PHP 5 XSLT intégré. 2) Pensez à une autre façon de faire correspondre.

Quelle serait la meilleure façon de gérer cela?

Le document d'entrée se trouvent à http://krisvandenbergh.be/uml_pricing.xml

Toute aide serait appréciée! Merci.

+0

Le document d'entrée est plus de 10000 lignes .. Il peut être trouvé ici http://krisvandenbergh.be/uml_pricing.xml –

+0

Et en passant, un point (".") Est un caractère valide pour un nom qualifié dans un document XML, c'est-à-dire qu'il n'y a pas besoin de s'échapper (voir http://www.w3.org/TR/REC-xml/#NT-NameChar). –

+0

Modifié les questions et donné plus de détails. –

Répondre

0

Si vous pouvez obtenir une correspondance sur XMI.content, alors ce n'est pas le "." dans Model_Management.Model qui vous rejette.

Il me semble que puisque vous recherchez des éléments qui sont 6 couches vers le bas, il peut y avoir une solution plus facile. Avez-vous essayé ceci:

<xsl:template match="Foundation.Core.Namespace.ownedElement"> 
    <!-- other code --> 
</xsl:template> 

La correspondance dans la balise de gabarit ne doit pas nécessairement être spécifique. Le select dans votre <xsl:apply-templates> où vous appelez le modèle doit être aussi spécifique que possible.

+0

Ok, maintenant ça marche d'une façon ou d'une autre. Cependant, le xsl renvoie beaucoup de chaînes d'autres éléments que je n'ai pas demandés. Dois-je faire correspondre tous ces éléments et ne rien afficher? Comme dans: et ainsi de suite .. –

Questions connexes