17

情况:

我有一个包含图像信息的简单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>
4

5 回答 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,因为它知道在属性值模板中使用时获取文本值。

于 2008-09-05T14:44:27.460 回答
4

那不应该是:

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

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

于 2008-09-05T14:22:01.633 回答
4

为了添加属性,XSL 想要

<xsl:元素名称="img">
     (属性)
</xsl:元素>

而不仅仅是

<图片>
     (属性)
</img>

虽然,是的,如果您只是按原样复制元素,则不需要任何这些。

于 2008-09-05T14:27:44.520 回答
3

没关系——我是个白痴。我只需要 <xsl:value-of select="/root/Image/node()"/>

于 2008-09-05T14:21:48.683 回答
0

另一个尝试的选择是简单的

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

即没有 {} 而是给出直接图像路径

于 2012-09-25T11:15:35.583 回答