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>
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top