Domanda

Situazione:

Ho un semplice XML documento che contiene informazioni sull'immagine.Ho bisogno di trasformarlo in HTML.Tuttavia, non riesco a vedere dove si trova il tag open e quando utilizzo il file XSL codice seguente, mostra il seguente messaggio di errore:

"Impossibile scrivere un nodo di attributi quando nessun tag di inizio elemento è aperto."

Contenuto 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>

Codice 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>
È stato utile?

Soluzione

Giusto per chiarire il problema qui: l'errore è nel seguente bit di codice:

<xsl:attribute name="src">
    <xsl:copy-of select="/root/Image/node()"/>
</xsl:attribute>

L'istruzione xsl:copy-of prende un nodo o un set di nodi e ne fa una copia, generando in output un nodo o un set di nodi.Tuttavia un attributo non può contenere un nodo, solo un valore testuale, quindi xsl:value-of sarebbe una soluzione possibile (poiché restituisce il valore testuale di un nodo o set di nodi).

Una soluzione MOLTO più breve (e forse più elegante) sarebbe la seguente:

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

L'uso di {} nell'attributo è chiamato modello di valore di attributo e può contenere qualsiasi espressione XPATH.

Nota, qui è possibile utilizzare lo stesso XPath utilizzato in xsl_copy-of poiché sa assumere il valore testuale quando utilizzato in un modello di valore di attributo.

Altri suggerimenti

Non dovrebbe essere:

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

?Sembra che tu stia tentando di copiare l'intero nodo Immagine/img nell'attributo @src

Per aggiungere attributi, XSL vuole

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

invece che solo

<img>
     (attributes)
</img>

Anche se sì, se stai semplicemente copiando l'elemento così com'è, non avrai bisogno di nulla di tutto ciò.

Non importa: sono un idiota.Avevo solo bisogno <xsl:value-of select="/root/Image/node()"/>

L'altra opzione da provare è semplice

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

cioè.senza {} ma fornendo invece il percorso diretto dell'immagine

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top