2011-09-29 2 views
1

Nous transformons ces données XML en format tube délimité en utilisant ... XSLComment itérer des données XML en utilisant XSL sans les noms d'éléments codés en dur?

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<LIBRARY> 
    <BOOK> 
     <TITLE>Professional JINI</TITLE> 
     <AUTHOR>Sing Li</AUTHOR> 
     <PUBLISHER>Wrox Publications</PUBLISHER> 
    </BOOK> 
</LIBRARY> 

.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="text" indent="no"/> 

    <!-- New line character variable --> 
    <xsl:variable name="newline"> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:variable> 

    <xsl:template match="/">   
     <xsl:for-each select="LIBRARY/BOOK"> 
      <xsl:value-of select="TITLE"/>|<xsl:value-of select="AUTHOR"/>|<xsl:value-of select="PUBLISHER"/> 
      <xsl:value-of select="$newline"/>  
     </xsl:for-each> 

    </xsl:template> 
</xsl:stylesheet> 

Ceci est la sortie ...

Professional JINI|Sing Li|Wrox Publications 

est-il un moyen d'obtenir les valeurs de titre, auteur, etc..from sans coder en dur les noms d'éléments xsl: value-of ? Nous voulons que ce XSL soit générique de sorte que si nous ajoutons plus d'attributs de livre plus tard, la feuille de style capturera automatiquement ces nouveaux champs.

Répondre

-1

Vous voulez dire une concaténation de tous les sous-éléments avec | les séparer?

<xsl:for-each select="node()>|<xsl:value-of select="."/></xsl:for-each> 
+0

Je veux que la sortie soit le même, mais je ne veux pas coder en dur les noms d'éléments xsl: value-of, je veux être plus générique pour soutenir un certain nombre d'éléments de livre. – raffian

+0

J'ai essayé, et les valeurs correctes sont extraites, mais le format de sortie est foiré, ce n'est pas sur une seule ligne; c'est en fait similaire au Xml source; On dirait que l'espace blanc est tiré de la source; comment puis-je empêcher cela? – raffian

+0

Je l'ai compris, raffian

0

Voici une solution complète XSLT 1.0 qui est probablement parmi les plus simples (pas xsl:for-each, le style push) la plus courte possible:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="BOOK"> 
    <xsl:if test="not(position()=1)"> 
    <xsl:text>&#xA;</xsl:text> 
    </xsl:if> 
    <xsl:apply-templates select="*"/> 
</xsl:template> 

<xsl:template match="BOOK/*"> 
    <xsl:if test="not(position()=1)">|</xsl:if> 
    <xsl:value-of select="."/> 
</xsl:template> 
</xsl:stylesheet> 

lorsque cette transformation est appliquée sur le document XML suivant:

<LIBRARY> 
    <BOOK> 
     <TITLE>Professional JINI</TITLE> 
     <AUTHOR>Sing Li</AUTHOR> 
     <PUBLISHER>Wrox Publications</PUBLISHER> 
    </BOOK> 
    <BOOK> 
     <TITLE>XSLT 2.0 Programmer's Reference</TITLE> 
     <AUTHOR>Michael Kay</AUTHOR> 
     <PUBLISHER>Wrox Publications</PUBLISHER> 
    </BOOK> 
</LIBRARY> 

le résultat voulu, correct produit:

Professional JINI|Sing Li|Wrox Publications 
XSLT 2.0 Programmer's Reference|Michael Kay|Wrox Publications 

II. XSLT 2.0 solution:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="BOOK"> 
    <xsl:if test="not(position()=1)"> 
    <xsl:text>&#xA;</xsl:text> 
    </xsl:if> 
    <xsl:value-of select="*" separator="|"/> 
</xsl:template> 
</xsl:stylesheet> 
Questions connexes