如何添加图片?

18

情况:

我有一个包含图像信息的简单的XML文档,需要将其转换为HTML。 但是,我找不到开放标签所在的位置,当我使用下面的XSL代码时,会显示以下错误消息:

"Cannot write an attribute node when no element start tag is open."

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>

标题需要改进。目前这个标题没有提供任何关于在哪里或者想要“添加一张图片”的上下文信息,这样的标题会影响搜索结果。 - Jeffrey M
5个回答

27

这里需要澄清的问题是 - 错误出现在以下代码段:

<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表达式。

请注意,与xsl_copy-of中使用的XPath相同的XPath也可用于此处,因为在属性值模板中使用时,它知道取文本值。


我正在尝试解决非常相似的问题。我需要从PHP应用程序生成Word报告,因此我正在使用XSLT转换XML。上述解决方案是否适用于生成Word 2007文档? - ivantxo
不,上述内容并非用于生成Word文档,而只是从给定的XML输入创建<img>标签。如果您想使用XSLT生成Word文档,那么祝你好运,因为它非常复杂。 - samjudson

4

这句话应该这样写:

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

? 看起来您正在尝试将整个Image/img节点复制到属性@src


+1 这对我有用。我没有尝试过使用“/root/Image/node()”,因为那似乎毫无意义。 - Jules Colle

4
为了添加属性,XSL需要使用以下格式:
<xsl:element name="img">
     (属性)
</xsl:element>
而不是直接使用以下格式:
<img>
     (属性)
</img>
当然,如果你只是复制元素本身,则不需要任何内容。

3

没关系 - 我很蠢。我只需要 <xsl:value-of select="/root/Image/node()"/>


0
另一个尝试的选择是直接的。
<img width="100" height="100" src="/root/Image/image.jpeg" class="CalloutRightPhoto"/>

即,不使用 {},而是直接提供图片路径

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接