¿Cómo se agrega una imagen?
Pregunta
Situación:
tengo una sencilla XML documento que contiene información de la imagen.necesito transformarlo en HTML.Sin embargo, no puedo ver dónde está la etiqueta abierta y cuándo uso la XLS código a continuación, muestra el siguiente mensaje de error:
"No se puede escribir un nodo de atributo cuando no hay ninguna etiqueta de inicio de elemento abierta".
Contenido 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>
código 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>
Solución
Sólo para aclarar el problema aquí: el error está en el siguiente código:
<xsl:attribute name="src">
<xsl:copy-of select="/root/Image/node()"/>
</xsl:attribute>
La instrucción xsl:copy-of toma un nodo o conjunto de nodos y hace una copia del mismo, generando un nodo o conjunto de nodos.Sin embargo, un atributo no puede contener un nodo, solo un valor textual, por lo que xsl:value-of sería una posible solución (ya que devuelve el valor textual de un nodo o conjunto de nodos).
Una solución MUCHO más corta (y quizás más elegante) sería la siguiente:
<img width="100" height="100" src="{/root/Image/node()}" class="CalloutRightPhoto"/>
El uso de {} en el atributo se denomina plantilla de valor de atributo y puede contener cualquier expresión XPATH.
Tenga en cuenta que aquí se puede utilizar el mismo XPath que utilizó en xsl_copy-of, ya que sabe tomar el valor textual cuando se utiliza en una plantilla de valor de atributo.
Otros consejos
¿No debería ser eso?
<xsl:value-of select="/root/Image/img/@src"/>
?Parece que estás intentando copiar todo el nodo Imagen/img al atributo @src
Para agregar atributos, XSL quiere
<xsl:element name="img"> (attributes) </xsl:element>
en lugar de solo
<img> (attributes) </img>
Aunque sí, si simplemente estás copiando el elemento tal como está, no necesitas nada de eso.
No importa, soy un idiota.solo necesitaba <xsl:valor-de seleccionar="/root/Image/node()"/>
La otra opción que puedes probar es una sencilla
<img width="100" height="100" src="/root/Image/image.jpeg" class="CalloutRightPhoto"/>
es decir.sin {} pero en lugar de dar la ruta directa de la imagen