HTML元素中的特殊字符

时间:2015-01-05 14:52:39

标签: html xml xslt xslt-1.0

我尝试做的是将百分号(%)直接输出到< td>标签。以下是我的代码:

  <table width="100%" border="0" cellspacing="0" cellpadding="0">
    <tr>
      <td class="item_container" %%=v(@Item_Container_Style)=%%>
  ...

当我测试XSL时,我收到以下错误:

  SAXParseException: Expected an attribute name (Set_A_Custom.xsl, line 205, column 38)

所以基本上它看到&#34; %% = v(@Item_Container_Style)= %%&#34;作为无效的HTML,但我需要这些代码。

如果您想知道我为什么这样做,那是因为我正在编写XSL来输出包含AMPscript的HTML(一种ExactTarget专有的脚本语言)。虽然不需要知道有关AMPscript的任何信息,但我只需要在HTML中输出百分号(%),一切都会正常工作。

有什么想法吗?为了记录,我使用的是XSL 1.0。谢谢大家!

3 个答案:

答案 0 :(得分:2)

XSLT样式表本身必须是格式良好的XML,因此您无法直接在样式表中包含此类构造。如果您使用的XSLT处理器支持disable-output-escaping,那么您可以执行类似

的操作
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <xsl:text disable-output-escaping="yes"><![CDATA[<td class="item_container" %%=v(@Item_Container_Style)=%%>]]></xsl:text>
      ...
    <xsl:text disable-output-escaping="yes"><![CDATA[</td>]]></xsl:text>
  </tr>
</table>

如果它不允许disable-output-escaping,那么您唯一的选择是使用text输出方法,并将所有标记输出为具有角度的文本括号转义(或CDATA)。

答案 1 :(得分:2)

  

我要做的是将百分号(%)直接输出到<td>代码中。

“html”或“xml”输出模式无法实现。 XSLT旨在创建语法上理智的 HTML,你不能让它做任何其他事情。

当然你可以切换到“文本”输出模式并做任何你喜欢的事情,但是用这种方式生成HTML要困难得多。

或者你可以使用disable-output-escaping,如果你的XSLT处理器支持它,但如果你需要在许多地方这样做,这将很快将你的XSLT样式表简化为乱七八糟。


话虽如此,这是一个提案。在XSLT中,您使用“html”输出模式,并且:

<td 
  class="item_container" 
  amp-1="%%=v({@Item_Container_Style})%%" 
  amp-2="%%=v({@Some_Other_Element})%%"
>
    some text %%=v(<xsl:value-of select="Other_Stuff" />)%% more text
</td>

这是语法上有效的XSLT,它涵盖了两种情况(属性中的多个占位符,文本中的多个占位符)并创建语法上有效的HTML:

<td 
  class="item_container" 
  amp-1="%%=v(item container style content)%%" 
  amp-2="%%=v(some other element content)%%"
>
    Here some text %%=v(other stuff)%%
</td>

然后使用后处理步骤将该HTML转换为AMPscript:

正则表达式将\bamp-\d+="(%%[\s\S]*?%%)"替换为$1,这将导致

<td 
  class="item_container" 
  %%=v(item container style content)%% 
  %%=v(some other element content)%%
>
    Here some text %%=v(other stuff)%%
</td>

通常强烈反对使用正则表达式处理HTML,但这可能只是一个足够狭窄的用例。

答案 2 :(得分:2)

AMPScript似乎有一种基于标准的语法作为其专有语法的替代方法:

分隔符比较

下表显示了标准AMPscript分隔符与服务器端分隔符之间的相似之处。

Standard AMPscript Delimiter    Tag-based AMPscript Delimiter
%%[                             <script runat=server language=ampscript>
etc

这对你有帮助吗?