为什么这个XSLT代码添加了一个新行?

Bea*_*red 1 xml xslt

在IE(也许是FF,但不确定)我的XSL样式表中的以下片段...

<td>
  <xsl:element name="img">
    <xsl:attribute name="src">
      <xsl:value-of select="image" />
    </xsl:attribute>
  </xsl:element>
</td>
Run Code Online (Sandbox Code Playgroud)

生成以下XHTML代码......

<td><img src="
    someimage.jpg"></td>
Run Code Online (Sandbox Code Playgroud)

src="在以后使用DOM解析它时会导致问题的新行.有任何想法吗?

非常感谢您的帮助!

Tom*_*lak 6

在其中一条评论中(对于现在删除的答案),您说您的输入如下所示:

<image>
 someimage.jpg</image>
Run Code Online (Sandbox Code Playgroud)

这是你的换行符的来源 - 它是节点值的一部分,因此由XSL处理器保留(它不是"添加",如你所怀疑的那样).

要删除空间,必须在输出之前修改节点值,在这种情况下最适合的是normalize-space()函数,因为URL通常不包含空格.

<td>
  <img src="{normalize-space(image)}"/>
</td>
Run Code Online (Sandbox Code Playgroud)

如果您有机会,应该在生成输入XML的过程中修复此问题,因为XML本身已经错误.如果换行不是数据的一部分,那么它不应该在那里.

与此处提出的许多其他人相反,您的XSLT代码布局对输出没有影响.在处理开始之前,所有空格都会从XSL样式表中删除,因此:

<td>
  <xsl:element name="img">
    <xsl:attribute name="src">
      <xsl:value-of select="image" />
    </xsl:attribute>
  </xsl:element>
</td>
Run Code Online (Sandbox Code Playgroud)

虽然不必要地冗长,但相当于:

<td>
  <xsl:element name="img"><xsl:attribute name="src"><xsl:value-of select="image" /></xsl:attribute>
  </xsl:element>
</td>
Run Code Online (Sandbox Code Playgroud)

就输出空白而言,相当于此:

<td><img src="{image}"/></td>
Run Code Online (Sandbox Code Playgroud)

但是,如果您的XSL代码中存在杂散文本节点,则会保留它们周围的所有空格.这意味着你不应该这样做:

<td>
  Stray Text
</td>
Run Code Online (Sandbox Code Playgroud)

因为这会"\n Stray Text\n "在输出中生成一个文本节点.更好的是:

<td>
  <xsl:text>Contained Text</xsl:text>
</td>
Run Code Online (Sandbox Code Playgroud)

关于:"但为什么不起作用<xsl:strip-space>?" 我建议阅读Pavel Minaev对这个问题的回答.