【问题标题】:Why does this XSLT code add a new line?为什么这个 XSLT 代码要添加一个新行?
【发布时间】:2009-11-19 05:24:14
【问题描述】:

在 IE 中(也可能是 FF,但不确定)我的 XSL 样式表中的以下 sn-p...

<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 解析它时会导致问题。有什么想法吗?

非常感谢您的帮助!

【问题讨论】:

  • 你确定吗?我尝试了相同的 xslt,结果根本没有任何空格
  • @Rashmi 你在 IE 中使用 transformNode() 函数来应用你的样式表吗?

标签: xml xslt


【解决方案1】:

在其中一个 cmets(现在已删除的答案)中,您说您的输入如下所示:

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

关于:“但是为什么&lt;xsl:strip-space&gt; 不起作用?”我推荐阅读Pavel Minaev's answer to exactly this question

【讨论】:

    【解决方案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】:

      我已经尝试过您的 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。

      【讨论】:

      • 你会这么认为,但我还有一条新线路。我肯定错过了什么。有了那个和条形空间,我仍然得到一条新线。不管怎样,我会继续努力的,谢谢你的帮助!
      • @Dr Dork,只是出于好奇,我想知道您使用的是哪种 XSLT 处理器。Saxon 和 Xalan 都没有这个问题。
      【解决方案4】:

      非常奇怪的问题,确实...

      你试过了吗?

      <xsl:attribute name="src"><xsl:value-of select="image" /></xsl:attribute>
      

      【讨论】:

        【解决方案5】:

        我同意 Robert 的观点,AVT 是一种可行的方法,但我也建议在图像周围使用 normalize-space(),因为源 xml 可能有换行符:

        <td>
          <img src="{normalize-space(image)}"/>
        </td>
        

        在我使用 xalan 2.7 的测试中,如果源代码有换行符,仅执行 AVT 并不能解决问题:

        <image>
           abc.jpg
        </image>
        

        【讨论】:

        • 不,这不会使问题消失,因为 AVT 等效于 /,只是更短。如果换行符在输入数据中,它会保留在那里。
        • 你一定错过了关于“normalize-space()”的部分。这是我的解决方案的关键点。源是新行字符所在的位置。
        猜你喜欢
        • 1970-01-01
        • 2015-05-22
        • 2012-12-27
        • 2013-02-15
        • 1970-01-01
        • 2017-01-10
        • 2011-08-31
        • 1970-01-01
        • 2015-01-01
        相关资源
        最近更新 更多