在 XSL 中创建空格 ( )

see*_*ker 2 c# xml xslt

我试图通过以下方式在 XSL 文档中创建自动间距。

<td><xsl:value-of select="Name/First"/> <xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text><xsl:value-of select="Name/Last"/> </td> 但是,呈现的 HTML 具有以下形式

<td>John&amp;nbsp;Grisham</td>
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题的任何想法?

Ben*_*Ben 6

您的直接问题是,虽然 unicode 160(十六进制 0xA0)&nbsp;是一个 HTML 实体,但它不是一个 XML 实体。

使用&#160;&#xA0;代替非换行空间。

但是,对于更大的问题,如何处理 XSL 中的空白,答案很简单:使用<xsl:text>.

每次包含任何纯文本时,请将其括在<xsl:text> the text goes here </xsl:text>标签中。如果不这样做,下次聪明的文本编辑器重新格式化您的文档时,您将陷入痛苦的境地。

您至少已经进入了一个大陆,或者如果您幸运的话,您可能已经进入了一个痛苦的国家,因为期望 XML/XSL 保留空白。即使是理解 XSL 到第 n 级的天才仍然会从空白处理中得到县级或至少自治市级的痛苦。(自治市镇级别的痛苦在 XML 规范“2.11 End-of-Line Handling”中编码,因为其疯狂的设计决定拒绝区分 LF 和 CRLF - 所以没有人可以避免这一点)。

只是为了让您知道会发生什么:这并不容易 - 您可以在<xsl:text>很长一段时间内摆脱标签,但如果您接受它并从一开始就将它们放入,那么它会更容易长跑。

示例错误:

  <xsl:element name="MyElem">
      <xsl:attribute name="fullPath">c:\base\Path\here\<xsl:value-of select="../parent/@relPath"/>\<xsl:value-of select="@fileName">
      </xsl:attribute>
  </xsl:element>
Run Code Online (Sandbox Code Playgroud)

右侧示例:

  <xsl:element name="MyElem">
      <xsl:attribute name="fullPath">
          <xsl:text>c:\base\Path\here\</xsl:text>
          <xsl:value-of select="../parent/@relPath"/>
          <xsl:text>\</xsl:text>
          <xsl:value-of select="@fileName">
      </xsl:attribute>
  </xsl:element>
Run Code Online (Sandbox Code Playgroud)

问题是,它们都产生完全相同的输出

但其中一个会在未来的某个时候搞砸,是的,可能是被尚未出生的人搞砸了,另一个不会。

简短的解释是:默认情况下忽略仅包含空格的节点(除非您调整选项)。所以这是仅由什么CRLFTABSPACE之间><。由非空白文本组成的节点,带有前导和尾随空白,可能有“折叠”的空白 - 即 effed up。

所以 Example RIGHT 和这个之间的区别:

  <xsl:element name="MyElem">
      <xsl:attribute name="fullPath">
          c:\base\Path\here\
          <xsl:value-of select="../parent/@relPath"/>
          \
          <xsl:value-of select="@fileName">
      </xsl:attribute>
  </xsl:element>
Run Code Online (Sandbox Code Playgroud)

是一个生成<MyElem fullPath="c:\base\Path\here\relative\path\filename.txt"/>,另一个,根据有效的 DOM 选项,生成以下之一:

<MyElem fullPath="c:\base\Path\here\relative\path\filename.txt"/>
<MyElem fullPath="c:\base\Path\here\ relative\path \ filename.txt"/>
<MyElem fullPath="c:\base\Path\here\&#10;relative\path&#10;\&10;filename.txt"/>
<MyElem fullPath="c:\base\Path\here\&#9;&#10;relative\path&#9;&#10;\&#9;&10;&#9;filename.txt"/>
Run Code Online (Sandbox Code Playgroud)

只有其中一个是您想要的……根据有效的选项,其中任何一个都可能是正确的……