如何添加图像?

时间:2020-03-05 18:48:15  来源:igfitidea点击:

我有一个包含图像信息的简单XML文档。我需要将其转换为HTML-简单,对吧?但是,当我在下面使用XSL时,它会爆炸并显示错误"没有打开元素开始标记时无法编写属性节点"。我看不到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>

解决方案

回答

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

回答

那不应该是:

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

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

回答

为了添加属性,XSL希望

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

而不只是

<img>
     (attributes)
</img>

虽然,是的,但是,如果我们仅按原样复制元素,则不需要任何内容​​。

回答

只是为了在这里澄清问题,该错误在于以下代码中:

<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,因为它知道在属性值模板中使用时将采用文本值。