在IE中(也许是FF,但不确定)我的XSL样式表中的以下片段......
<td>
<xsl:element name="img">
<xsl:attribute name="src">
<xsl:value-of select="image" />
</xsl:attribute>
</xsl:element>
</td>
生成以下XHTML代码......
<td><img src="
someimage.jpg"></td>
在src="
之后插入的这一新行在以后使用DOM解析时会导致问题。任何想法?
非常感谢您的帮助!
答案 0 :(得分:6)
在其中一条评论中(对于现已删除的答案),您说您的输入如下:
<image>
someimage.jpg</image>
这是你的换行符所在的位置 - 它是节点值的一部分,因此由XSL处理器保留(它不是“添加”,如你所怀疑的那样)。
要删除空格,必须在输出之前修改节点值,在这种情况下最适合的是normalize-space()
函数,因为URL通常不包含空格。
<td>
<img src="{normalize-space(image)}"/>
</td>
如果有任何机会,应在生成输入XML的过程中修复此问题,因为XML本身已经错误。如果换行不是数据的一部分,那么它不应该在那里。
与此处提出的许多其他人相反,您的XSLT代码布局对输出没有影响。在处理开始之前,所有空格都会从XSL样式表中删除,因此:
<td>
<xsl:element name="img">
<xsl:attribute name="src">
<xsl:value-of select="image" />
</xsl:attribute>
</xsl:element>
</td>
虽然不必要地冗长,但相当于:
<td>
<xsl:element name="img"><xsl:attribute name="src"><xsl:value-of select="image" /></xsl:attribute>
</xsl:element>
</td>
就输出空白而言,等同于此:
<td><img src="{image}"/></td>
但是,如果您的XSL代码中存在杂散文本节点,则会保留它们周围的所有空格。这意味着你不应该这样做:
<td>
Stray Text
</td>
因为这会在输出中生成"\n Stray Text\n "
文本节点。更好的是:
<td>
<xsl:text>Contained Text</xsl:text>
</td>
关于:“但为什么<xsl:strip-space>
不起作用?”我建议阅读Pavel Minaev's answer to exactly this question。
答案 1 :(得分:2)
我已经尝试过你的XSLT了,事实上我认为你应该重新考虑你选择的XSLT处理器,这是不应该发生的。
无论如何,这应该解决它:
<xsl:attribute name="src">
<xsl:text/><xsl:value-of select="image" /><xsl:text/>
</xsl:attribute>
试试这个
<td>
<img src="{image}"/>
</td>
如果这不起作用,那我就傻眼了......也许检查你的数据源? XSLT的输入是否包含:
<image>someimage.ext</image>
或
<image>
someimage.ext
</image>
如果是后者,那么我认为你的输入可能是问题,而不是你的XSLT。
答案 2 :(得分:2)
我不知道为什么XSLT中的空白节点正在进入属性值,但是有一种非常简单的方法来消除问题:使用属性值模板。除了解决实际问题之外,这可以让你摆脱大量的挫折。
而不是:
<td>
<xsl:element name="img">
<xsl:attribute name="src">
<xsl:value-of select="image" />
</xsl:attribute>
</xsl:element>
</td>
这样做:
<td>
<img src="{image}"/>
</td>
答案 3 :(得分:1)
非常奇怪的问题,确实......
你试过这个吗?
<xsl:attribute name="src"><xsl:value-of select="image" /></xsl:attribute>
答案 4 :(得分:1)
我同意Robert认为AVT是一种可行的方法,但我还建议在图像周围抛出一个normalize-space(),因为源xml可能有新行字符:
<td>
<img src="{normalize-space(image)}"/>
</td>
在我使用xalan 2.7的测试中,如果源有一个新的行字符,只是做AVT并没有解决问题:
<image>
abc.jpg
</image>