2010-01-14 6 views
0

Il y a un XSL qui comprend un autre XSL:XPath: Sélection de noeuds inclus par un <xsl:include>

<xsl:include href="registered.xsl"/> 

Ce fichier inclus a une liste de nœuds:

<g:registered> 
    <node1/> 
    <node2/> 
</g:registered> 

Documentation dit que « les enfants du <xsl:stylesheet> élément dans ce document remplacer l'élément dans le document inclus ", donc je pense que, étant donné que la directive include a fonctionné, je peux sélectionner g: nœuds enregistrés comme s'ils appartenaient toujours au document inclus:

select="document('')/xsi:schema/g:registered" 

Cela retourne un ensemble de nœuds vide.

Cependant, ceci:

select="document('registered.xsl')/xsi:schema/g:registered" 

ne sélectionne ce qui est nécessaire, mais, comme je le suppose, signifie ouvrir le fichier inclus pour la deuxième fois ce qui ne semble pas agréable pour moi.

Alors, comment puis-je les sélectionner sans ouvrir le fichier une seconde fois?

EDIT

structure du document demandé: document inclus:

<?xml version='1.0' encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:g="http://www.sample.com/ns"> 

<g:registered-templates> 
    <SampleTemplate/> 
    <WrongTemplate/> 
</g:registered-templates> 

<xsl:include href="Sample Template.xsl" /> 
<xsl:include href="Wrong Template.xsl" /> 

</xsl:stylesheet> 

y compris le document:

<?xml version='1.0' encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:g="http://www.sample.com/ns"> 

<xsl:output method="text"/> 

<xsl:include href="Label Registration.xsl"/> 

<!-- How do I refer to just loaded inclusion without directing engine to the file again? --> 
<xsl:variable name="template-names" select="document('Label Registration.xsl')/xsl:stylesheet/g:registered-templates"/> 

<xsl:template match="Job"> 
    <xsl:for-each select="WorkItem"> 
    <xsl:apply-templates select="$template-names/*[local-name()=current()/@name]"> 
     <xsl:with-param name="context" select="." /> 
    </xsl:apply-templates> 
    </xsl:for-each> 
</xsl:template> 


</xsl:stylesheet> 
+0

Veuillez montrer la structure des documents principaux et inclus (ie les éléments racine et tous les nœuds du chemin de la racine vers le xsl: include (dans le document principal) et le g: registered node (dans le document inclus) Sans cela, il est peu probable que vous obteniez beaucoup d'aide. –

+0

Ok, je pensais juste avoir présenté toutes les informations pertinentes. – GSerg

Répondre

0

Ok, j'avais mal compris.

La fonction document('') ouvre quand même le fichier, donc elle n'a aucun avantage, sur le plan des performances, sur document('registered.xsl'). Et comme il interroge le fichier , pas le modèle DOM actuellement modifié du document en cours, le résultat n'inclut pas mes inclusions.

Et il n'est pas possible d'interroger le modèle DOM du modèle de transformation lui-même, en ce qui me concerne.

0

Sélection dans votre modèle noms variables Queri es le document source de transformation - pas votre feuille de style incluse. Si vous voulez vous référer à g: registered-templates, vous devez pointer vers le fichier comme un second document source.

EDIT

Je ne suis pas vraiment sûr. mais il semble que vous vouliez créer un élément en fonction de la valeur de l'attribut. Dans ce cas, ce post will sera intéressant pour vous.

<xsl:for-each select="WorkItem"> 
    <xsl:element name="{Type}" > 
     <xsl:value-of select="current()/@name"/> 
    </xsl:element> 
</xsl:for-each> 
+0

Non, ce n'est pas si simple. Je faisais ce tour: http://www.biglist.com/lists/xsl-list/archives/200110/msg00753.html – GSerg

Questions connexes