Как вы добавляете изображение? - PullRequest
17 голосов
/ 05 сентября 2008

Положение:

У меня есть простой XML документ, который содержит информацию об изображении. Мне нужно преобразовать его в HTML . Однако я не вижу, где находится открытый тег, и когда я использую приведенный ниже код XSL , отображается следующее сообщение об ошибке:

"Невозможно записать узел атрибута, если открыт начальный тег элемента."

Содержимое 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>

Ответы [ 5 ]

27 голосов
/ 05 сентября 2008

Просто чтобы прояснить проблему здесь - ошибка в следующем бите кода:

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

Инструкция xsl: copy-of берет узел или набор узлов и создает его копию - выводя узел или набор узлов. Однако атрибут не может содержать узел, только текстовое значение, поэтому xsl: value-of было бы возможным решением (так как это возвращает текстовое значение узла или набора узлов).

НАМНОГО более короткое решение (и, возможно, более элегантное) будет следующим:

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

Использование {} в атрибуте называется шаблоном значения атрибута и может содержать любое выражение XPATH.

Обратите внимание, здесь можно использовать тот же XPath, который вы использовали в xsl_copy-of, поскольку он знает, что он принимает текстовое значение при использовании в шаблоне значений атрибутов.

4 голосов
/ 05 сентября 2008

Разве это не должно быть:

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

? Похоже, вы пытаетесь скопировать весь узел Image / img в атрибут @ src

4 голосов
/ 05 сентября 2008

Чтобы добавить атрибуты, XSL хочет

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

вместо

<img>
     (attributes)
</img>

Хотя, да, если вы просто копируете элемент как есть, вам это не нужно.

3 голосов
/ 05 сентября 2008

Неважно - я идиот. Мне просто нужно

0 голосов
/ 25 сентября 2012

Другой вариант - простой

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

т.е. без {}, но вместо этого указав прямой путь к изображению

...