2012-11-01 1 views
3

J'ai un certain nombre de fichiers xml à partir desquels j'essaie de créer une table WordML. Il y a un certain nombre de nœuds dans chaque nodelist, et j'ai besoin de créer une colonne pour chacun d'entre eux, jusqu'à un maximum de 15 colonnes. Cependant, s'il y en a moins de 15, les colonnes doivent être justifiées.Table XSLT WordML avec colonnes dynamiques basées sur le nombre de nœuds

modèle appelé NodeList:

<xsl:template match="NodeList"> 
<xsl:for-each select="NodeRef"> 
<xsl:sort data-type="number" select="@Position" order="ascending"/> 
<xsl:sort data-type="text" select="@Name" order="ascending"/> 
<xsl:variable name="documentName" select="concat(@Id, '_Nodes.xml')"/> 
<xsl:apply-templates mode="SimpleNode" select="document($documentName)/Node"/> 
</xsl:for-each> 
</xsl:template> 

modèle appelé simpleNode:

<xsl:template mode="SimpleNode" match="Node"> 
<!-- Output the Node Table - as template within for-each, 
will output table many times --> 
<xsl:call-template name="SimpleNodeTable"/> 
</xsl:template> 

modèle SimpleNodeTable (où je suis bloqué):

<xsl:template name="SimpleNodeTable"> 
<w:tbl> 
    <w:tblPr> 
    <w:tblStyle w:val="ReportTable1"/> 
    <w:tblW w:type="dxa"> 
     <xsl:attribute name="w:w"> 
     <xsl:value-of select="$landscapeBodyWidth"/> 
     </xsl:attribute> 
    </w:tblW> 
    <w:tblLayout w:type="Fixed"/> 
    </w:tblPr> 
    <w:tblGrid> 
    <w:gridCol> 
     <xsl:attribute name="w:w"> 
     <xsl:value-of select="$nodeNameWidth"/> 
     </xsl:attribute> 
    </w:gridCol> 
    <w:gridCol> 
     <xsl:attribute name="w:w"> 
     <xsl:value-of select="$landscapeBodyWidth - $nodeNameWidth"/> 
     </xsl:attribute> 
    </w:gridCol> 
    </w:tblGrid> 
    <w:tr> 
    <!-- first row --> 
    <w:tc> 
     <!-- First cell is blank so vertically merge --> 
     <w:vmerge w:val="restart"/> 
     <w:p/> 
    </w:tc> 
    <!-- HOW TO DO A FOR EACH LOOP TO ADD 1 COLUMN PER NODEREF?? --> 
    <xsl:for-each select="Node"> 
    <w:tc> 
     <w:p> 
     <!-- Second cell contains the name of the node (from xml file) --> 
     <w:t> 
      <xsl:value-of select="NodeName"/> 
     </w:t> 
     </w:p> 
    </w:tc> 
    </xsl:for-each> 
    </w:tr> 
</w:tbl> 
</xsl:template> 

Peut-être que je suis dans cette approche un moyen complètement faux, mais j'ai fini par me confondre avec essayer d'obtenir 1 table et puis de commencer la boucle pour chaque. Je serais reconnaissant pour tout conseil/orientation.

+0

Votre structure w: tblGrid ne doit-elle pas contenir autant d'éléments w: gridCol que le nombre maximal de nœuds nodaux dans les fichiers XML source? – collapsar

+0

Je ne suis pas sûr de comprendre ... votre problème est que vous voulez transposer la table, non? Si oui, jetez un coup d'oeil à ceci: http://stackoverflow.com/questions/1171376/matrix-transposition-in-xslt – Efrain

Répondre

0

Le lien fourni par Efrain est la bonne direction mais je pense que cela peut être encore plus simple.

<xsl:variable name="max-col"> 
    <xsl:choose> 
     <xsl:when test="count(Node) &gt; 15">16</xsl:when> 
     <xsl:otherwise><xsl:value-of select="count(Node) + 1"/></xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

<!-- Then take only the first 'max-col' Nodes --> 
<xsl:for-each select="Node[position() &lt; $max-col]"> 
    <!-- ..... your code ....... --> 
</xsl:for-each> 

Utilisez la même variable pour l'en-tête et pour les lignes.

Questions connexes