2008-09-05 23 views
16

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 hay ninguna etiqueta de inicio del elemento abierta". No puedo ver dónde está la etiqueta abierta, ¿alguna idea?¿Cómo agregar una imagen?

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> 

Respuesta

25

sólo 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> 

el XSL instrucción: copia de la toma de un nodo o conjunto de nodos y hace una copia de la misma - salida 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 corto (y quizás más elegante) serían los siguientes:

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

El uso de la {} en el atributo que se llama un atributo Plantilla del valor, y puede contener cualquier expresión XPath.

Nota: 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.

+0

Estoy tratando de resolver algo muy similar. Necesito generar informes de palabras de una aplicación PHP para lo que estoy transformando XML con XSLT. ¿Funciona la solución anterior para generar documentos word 2007? – ivantxo

+0

No, lo anterior no es para generar documentos de palabras, sino simplemente para crear una etiqueta a partir de la entrada XML dada. Si desea generar documentos de Word utilizando XSLT, entonces buena suerte, ya que es muy complejo. – samjudson

3

No importa - que soy un idiota. Sólo necesitaba < xsl: value-of select = "/ root/Imagen/nodo()"/>

4

¿No debería ser:

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

? Parece que usted está tratando de copiar todo el nodo de imagen/img para el atributo @src

+0

1 Esto funcionó para mí. No he intentado con "/ root/Image/node()" porque eso simplemente no parece tener sentido. –

3

Para añadir atributos, XSL quiere

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

en lugar de sólo

 
<img> 
    (attributes) 
</img> 

Aunque, sí, si solo está copiando el elemento tal como está, no necesita nada de eso.

0

La otra opción de probar es un sencillo

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

es decir, sin {} pero en lugar de dar la ruta de la imagen directa

Cuestiones relacionadas