How do you add an image?

匿名 (未验证) 提交于 2019-12-03 02:50:02

问题:

I have a simple XML document that contains image information. I need to transform it to HTML -- simple, right? However, when I use the XSL below, it blows up with the error "Cannot write an attribute node when no element start tag is open." I can't see where the open tag is -- any ideas?

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:

Just to clarify the problem here - the error is in the following bit of code:

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

The instruction xsl:copy-of takes a node or node-set and makes a copy of it - outputting a node or node-set. However an attribute cannot contain a node, only a textual value, so xsl:value-of would be a possible solution (as this returns the textual value of a node or nodeset).

A MUCH shorter solution (and perhaps more elegant) would be the following:

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

The use of the {} in the attribute is called an Attribute Value Template, and can contain any XPATH expression.

Note, the same XPath can be used here as you have used in the xsl_copy-of as it knows to take the textual value when used in a Attribute Value Template.



回答2:

Shouldn't that be:

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

? It looks like you are trying to copy the entire Image/img node to the attribute @src



回答3:

Never mind -- I'm an idiot. I just needed <xsl:value-of select="/root/Image/node()"/>



回答4:

In order to add attributes, XSL wants

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

instead of just

 <img>      (attributes) </img> 

Although, yes, if you're just copying the element as-is, you don't need any of that.



回答5:

The other option to try is a straightforward

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

i.e. without {} but instead giving the direct image path



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!