xml - insertar - etiquetas html
¿Cómo agregas una imagen? (5)
¿No debería ser eso?
<xsl:value-of select="/root/Image/img/@src"/>
? Parece que está intentando copiar todo el nodo Imagen / img al atributo @src
Tengo un documento XML simple que contiene información de imagen. Necesito transformarlo a HTML, simple, ¿verdad? Sin embargo, cuando uso el XSL a continuación, explota con el error "No se puede escribir un nodo de atributo cuando no está abierta ninguna etiqueta de inicio del elemento". No puedo ver dónde está la etiqueta abierta, ¿alguna idea?
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>
La otra opción para probar es una simple
<img width="100" height="100" src="/root/Image/image.jpeg" class="CalloutRightPhoto"/>
es decir, sin {}, sino que proporciona la ruta de la imagen directa
No importa, soy un idiota. Solo necesitaba <xsl: value-of select = "/ root / Image / node ()" />
Para aclarar el problema aquí, el error está en el siguiente fragmento de 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 realiza una copia de este, 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 solución posible (ya que esto 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 el mismo XPath se puede usar aquí como lo ha usado en xsl_copy-of, ya que sabe que toma el valor textual cuando se usa en una Plantilla de valor de atributo.
Para agregar atributos, XSL quiere
<xsl:element name="img"> (attributes) </xsl:element>
en lugar de simplemente
<img> (attributes) </img>
Aunque, sí, si solo está copiando el elemento tal como está, no necesita nada de eso.