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>
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top