Как вы добавляете изображение?
У меня есть простой XML-документ, содержащий информацию об изображении. Мне нужно преобразовать его в HTML - просто, правильно? Однако, когда я использую XSL ниже, он взрывается с ошибкой "Невозможно записать атрибут node, когда не запускается тег начала элемента." Я не вижу, где открыт открытый тег - - любые идеи?
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>
Ответы
Ответ 1
Просто, чтобы прояснить проблему здесь - ошибка находится в следующем бите кода:
<xsl:attribute name="src">
<xsl:copy-of select="/root/Image/node()"/>
</xsl:attribute>
Команда xsl: copy-of принимает набор node или node и делает его копию - вывод node или node -set. Однако атрибут не может содержать node, только текстовое значение, поэтому xsl: value-of будет возможным решением (так как это возвращает текстовое значение node или nodeet).
МНОГО более короткое решение (и, возможно, более элегантное) было бы следующим:
<img width="100" height="100" src="{/root/Image/node()}" class="CalloutRightPhoto"/>
Использование {} в атрибуте называется шаблоном значения атрибута и может содержать любое выражение XPATH.
Обратите внимание, что тот же XPath можно использовать здесь, как вы использовали в xsl_copy, так как он знает, чтобы использовать текстовое значение при использовании в шаблоне значения атрибута.
Ответ 2
Не должно быть:
<xsl:value-of select="/root/Image/img/@src"/>
? Похоже, вы пытаетесь скопировать весь Image/img node в атрибут @src
Ответ 3
Ничего, я идиот. Мне просто нужно
< xsl: значение-select = "/root/Изображение/ node()" / >
Ответ 4
Чтобы добавить атрибуты, XSL хочет
<xsl:element name="img">
(attributes)
</xsl:element>
вместо
<img>
(attributes)
</img>
Хотя, да, если вы просто копируете элемент as-is, вам это не нужно.
Ответ 5
Другой вариант попробовать - это простой
<img width="100" height="100" src="/root/Image/image.jpeg" class="CalloutRightPhoto"/>
то есть. без {}, но вместо этого давая прямой путь изображения