题
情况:
我有一个简单的 XML 包含图像信息的文档。我需要把它改造成 超文本标记语言. 。但是,我看不到开放标签在哪里以及何时使用 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>
解决方案
只是为了澄清这里的问题 - 错误位于以下代码中:
<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,因为它知道在属性值模板中使用时获取文本值。
其他提示
难道不应该是:
<xsl:value-of select="/root/Image/img/@src"/>
?看起来您正在尝试将整个 Image/img 节点复制到属性 @src
为了添加属性,XSL 想要
<xsl:element name="img"> (attributes) </xsl:element>
而不是仅仅
<img> (attributes) </img>
不过,是的,如果您只是按原样复制元素,则不需要任何这些。
没关系——我是个白痴。我只是需要 <xsl:value-of select="/root/Image/node()"/>
另一种尝试的选择是简单的
<img width="100" height="100" src="/root/Image/image.jpeg" class="CalloutRightPhoto"/>
IE。不带 {},而是给出直接图像路径
不隶属于 StackOverflow