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

时间:2009-11-19 05:24:15

标签: xml xslt

在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解析时会导致问题。任何想法?

非常感谢您的帮助!

5 个答案:

答案 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>