2008-09-05 9 views
16

J'ai un document XML simple qui contient des informations sur l'image. J'ai besoin de le transformer en HTML - simple, non? Cependant, quand j'utilise le XSL ci-dessous, il gonfle avec l'erreur "Impossible d'écrire un noeud d'attribut quand aucun tag de début d'élément est ouvert." Je ne peux pas voir où est la balise ouverte - des idées?Comment ajoutez-vous une image?

XML:

 
<root> 
    <HeaderText> 
     <HeaderText>Dan Testing</HeaderText> 
    </HeaderText> 
    <Image> 
     <img width="100" height="100" alt="FPO lady" src="/uploadedImages/temp_photo_small.jpg"/> 
    </Image> 
    <BodyText> 
     <p>This is a test of the body text<br /></p> 
    </BodyText> 
    <ShowLinkArrow>false</ShowLinkArrow> 
</root> 

XSL:

 
<xsl:stylesheet version="1.0" extension-element-prefixes="msxsl" 
    exclude-result-prefixes="msxsl js dl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:js="urn:custom-javascript" xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:dl="urn:datalist"> 
    <xsl:output method="xml" version="1.0" omit-xml-declaration="yes" indent="yes" encoding="utf-8"/> 
    <xsl:template match="/" xml:space="preserve"> 
     <img> 
      <xsl:attribute name="width"> 
       100 
      </xsl:attribute> 
      <xsl:attribute name="height"> 
       100 
      </xsl:attribute> 
      <xsl:attribute name="class"> 
       CalloutRightPhoto 
      </xsl:attribute> 
      <xsl:attribute name="src"> 
       <xsl:copy-of select="/root/Image/node()"/> 
      </xsl:attribute> 
     </img> 
    </xsl:template> 
</xsl:stylesheet> 

Répondre

25

Juste pour clarifier le problème ici - l'erreur est dans le bit de code suivant:

<xsl:attribute name="src"> 
    <xsl:copy-of select="/root/Image/node()"/> 
</xsl:attribute> 

L'instruction xsl: copy-of prend un nœud ou ensemble de nœuds et fait une copie de celui-ci - sortie un noeud ou un ensemble de noeuds. Cependant, un attribut ne peut pas contenir un nœud, seulement une valeur textuelle, donc xsl: value-of serait une solution possible (car cela renvoie la valeur textuelle d'un nœud ou d'un nœud).

Une solution beaucoup plus courte (et peut-être plus élégant) seraient les suivantes:

<img width="100" height="100" src="{/root/Image/node()}" class="CalloutRightPhoto"/> 

L'utilisation du {} dans l'attribut est appelé un attribut de valeur de modèle, et peut contenir toute expression XPath. Notez que le même XPath peut être utilisé ici comme vous l'avez utilisé dans xsl_copy-of car il sait prendre la valeur textuelle lorsqu'il est utilisé dans un modèle de valeur d'attribut.

+0

J'essaie de résoudre quelque chose de très similaire. J'ai besoin de générer des rapports de mots à partir d'une application PHP pour ce que je suis en train de transformer XML avec XSLT. La solution ci-dessus fonctionne-t-elle pour générer des documents Word 2007? – ivantxo

+0

Non, ce qui précède n'est pas pour générer des documents Word, mais simplement pour créer une balise à partir de l'entrée XML donnée. Si vous voulez générer des documents Word en utilisant XSLT alors bonne chance, car c'est très complexe. – samjudson

3

Qu'à cela ne tienne - je suis un idiot. Je voulais juste < xsl: value-of select = "/ root/Image/node()"/>

4

Si ce pas:

<xsl:value-of select="/root/Image/img/@src"/> 

? Il semble que vous essayez de copier l'intégralité du noeud image/img à l'attribut @src

+0

+1 Cela a fonctionné pour moi. Je n'ai pas essayé avec "/ root/Image/node()" parce que cela ne semble pas avoir de sens .. –

3

Pour ajouter des attributs, XSL veut

 
<xsl:element name="img"> 
    (attributes) 
</xsl:element> 

au lieu de simplement

 
<img> 
    (attributes) 
</img> 

Bien que, oui, si vous ne faites que copier l'élément tel quel, vous n'en avez pas besoin.

0

L'autre option est d'essayer un

simple
<img width="100" height="100" src="/root/Image/image.jpeg" class="CalloutRightPhoto"/> 

sans dire {}, mais au lieu de donner le chemin d'image directe