在XSL中创建一个space()

时间:2013-04-03 21:59:24

标签: 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>

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

2 个答案:

答案 0 :(得分:2)

你当前的问题是,虽然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线下处理”由其疯狂的设计决定拒绝区分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>

示例右:

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

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

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

简短的解释是这样的:默认情况下忽略仅由WHITESPACE组成的节点(除非你调整选项)。因此,CRLF之间的任何内容都只包含TABSPACE><。由具有前导和尾随空格的非空白文本组成的节点可能具有“折叠”的空白 - 即。放弃了。

因此示例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>

是生成<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\ 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"/> ,另一个生成,取决于有效的DOM选项,生成其中一个:

{{1}}

其中只有一个是你想要的...... 但其中任何一个都可能是正确的 ,具体取决于有效的选项......

答案 1 :(得分:-1)

使用此<xsl:text disable-output-escaping="yes">&amp;</xsl:text>nbsp;并且它有效!