Como você adiciona uma imagem?
Pergunta
Situação:
Eu tenho um simples XML documento que contém informações da imagem.Eu preciso transformá-lo em HTML.No entanto, não consigo ver onde está a tag aberta e quando uso a tag XSL código abaixo, ele mostra a seguinte mensagem de erro:
"Não é possível gravar um nó de atributo quando nenhuma tag de início de elemento está aberta."
Conteúdo 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>
Solução
Apenas para esclarecer o problema aqui - o erro está no seguinte trecho de código:
<xsl:attribute name="src">
<xsl:copy-of select="/root/Image/node()"/>
</xsl:attribute>
A instrução xsl:copy-of pega um nó ou conjunto de nós e faz uma cópia dele - gerando um nó ou conjunto de nós.No entanto, um atributo não pode conter um nó, apenas um valor textual, então xsl:value-of seria uma solução possível (já que retorna o valor textual de um nó ou conjunto de nós).
Uma solução MUITO mais curta (e talvez mais elegante) seria a seguinte:
<img width="100" height="100" src="{/root/Image/node()}" class="CalloutRightPhoto"/>
O uso de {} no atributo é chamado de modelo de valor de atributo e pode conter qualquer expressão XPATH.
Observe que o mesmo XPath pode ser usado aqui como você usou no xsl_copy-of, pois ele sabe que assume o valor textual quando usado em um modelo de valor de atributo.
Outras dicas
Não deveria ser:
<xsl:value-of select="/root/Image/img/@src"/>
?Parece que você está tentando copiar todo o nó Image/img para o atributo @src
Para adicionar atributos, o XSL deseja
<xsl:element name="img"> (attributes) </xsl:element>
em vez de apenas
<img> (attributes) </img>
Embora, sim, se você estiver apenas copiando o elemento como está, não precisará de nada disso.
Não importa - eu sou um idiota.eu só precisava <xsl:valor-de select="/root/Image/node()"/>
A outra opção para tentar é simples
<img width="100" height="100" src="/root/Image/image.jpeg" class="CalloutRightPhoto"/>
ou sejasem {}, mas fornecendo o caminho direto da imagem