Frage

Situation:

Ich habe ein einfaches XML Dokument, das Bildinformationen enthält.Ich muss es umwandeln HTML.Ich kann jedoch nicht sehen, wo sich das offene Tag befindet und wann ich es verwende XSL Wenn Sie den folgenden Code eingeben, wird die folgende Fehlermeldung angezeigt:

„Ein Attributknoten kann nicht geschrieben werden, wenn kein Elementstart-Tag geöffnet ist.“

XML-Inhalt:

<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-Code:

<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>
War es hilfreich?

Lösung

Nur um das Problem hier zu verdeutlichen: Der Fehler liegt im folgenden Codebit:

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

Die Anweisung xsl:copy-of nimmt einen Knoten oder eine Knotenmenge und erstellt eine Kopie davon – und gibt einen Knoten oder eine Knotenmenge aus.Allerdings kann ein Attribut keinen Knoten, sondern nur einen Textwert enthalten, daher wäre xsl:value-of eine mögliche Lösung (da dies den Textwert eines Knotens oder Knotensatzes zurückgibt).

Eine VIEL kürzere (und vielleicht elegantere) Lösung wäre die folgende:

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

Die Verwendung von {} im Attribut wird als Attributwertvorlage bezeichnet und kann einen beliebigen XPATH-Ausdruck enthalten.

Beachten Sie, dass hier derselbe XPath verwendet werden kann, den Sie im xsl_copy-of verwendet haben, da er weiß, dass er den Textwert annimmt, wenn er in einer Attributwertvorlage verwendet wird.

Andere Tipps

Sollte das nicht sein:

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

?Es sieht so aus, als würden Sie versuchen, den gesamten Image/img-Knoten in das Attribut @src zu kopieren

Um Attribute hinzuzufügen, möchte XSL

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

statt nur

<img>
     (attributes)
</img>

Allerdings brauchen Sie nichts davon, wenn Sie das Element einfach so kopieren, wie es ist.

Egal – ich bin ein Idiot.Ich brauchte es einfach <xsl:value-of select="/root/Image/node()"/>

Die andere Option, die Sie ausprobieren können, ist eine unkomplizierte

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

d.h.ohne {}, sondern mit Angabe des direkten Bildpfads

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top