Come si aggiunge un'immagine?
Domanda
Situazione:
Ho un semplice XML documento che contiene informazioni sull'immagine.Ho bisogno di trasformarlo in HTML.Tuttavia, non riesco a vedere dove si trova il tag open e quando utilizzo il file XSL codice seguente, mostra il seguente messaggio di errore:
"Impossibile scrivere un nodo di attributi quando nessun tag di inizio elemento è aperto."
Contenuto 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>
Codice 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>
Soluzione
Giusto per chiarire il problema qui: l'errore è nel seguente bit di codice:
<xsl:attribute name="src">
<xsl:copy-of select="/root/Image/node()"/>
</xsl:attribute>
L'istruzione xsl:copy-of prende un nodo o un set di nodi e ne fa una copia, generando in output un nodo o un set di nodi.Tuttavia un attributo non può contenere un nodo, solo un valore testuale, quindi xsl:value-of sarebbe una soluzione possibile (poiché restituisce il valore testuale di un nodo o set di nodi).
Una soluzione MOLTO più breve (e forse più elegante) sarebbe la seguente:
<img width="100" height="100" src="{/root/Image/node()}" class="CalloutRightPhoto"/>
L'uso di {} nell'attributo è chiamato modello di valore di attributo e può contenere qualsiasi espressione XPATH.
Nota, qui è possibile utilizzare lo stesso XPath utilizzato in xsl_copy-of poiché sa assumere il valore testuale quando utilizzato in un modello di valore di attributo.
Altri suggerimenti
Non dovrebbe essere:
<xsl:value-of select="/root/Image/img/@src"/>
?Sembra che tu stia tentando di copiare l'intero nodo Immagine/img nell'attributo @src
Per aggiungere attributi, XSL vuole
<xsl:element name="img"> (attributes) </xsl:element>
invece che solo
<img> (attributes) </img>
Anche se sì, se stai semplicemente copiando l'elemento così com'è, non avrai bisogno di nulla di tutto ciò.
Non importa: sono un idiota.Avevo solo bisogno <xsl:value-of select="/root/Image/node()"/>
L'altra opzione da provare è semplice
<img width="100" height="100" src="/root/Image/image.jpeg" class="CalloutRightPhoto"/>
cioè.senza {} ma fornendo invece il percorso diretto dell'immagine