转换<和>

时间:2012-09-07 18:23:48

标签: xslt xslt-2.0

我有一个followig xml数据

<xml>
  <para> 
  <number>1</number>
             &lt;text class="text"&gt;the cost to the &lt;123; each capital property <a href="none" num="88(1)">88(1)</a> and (1.7) &lt;/text&gt;
  </para>

我想运行一个xslt脚本,它将提供以下输出

<xml>
  <para> 
  <number>1</number>
             <text class="text">the cost to the &lt;123; each capital property <a href="none" num="88(1)">88(1)</a> and (1.7) </text>
  </para>
 </xml>  

所以用&lt;text class="text"&gt;<text>替换&lt;/text&gt;</text>

我想过像这样使用包机maping

<xsl:character-map name="a">
<xsl:output-character character="&lt;" string="&lt;"/>
<xsl:output-character character="&gt;" string=">"/>
</xsl:character-map>

但是这种方法的问题在于它会将所有&lt;转换为<,导致我们不想像上面&lt;123;

那样替换它的问题

1 个答案:

答案 0 :(得分:3)

您要求做的是添加一个额外的“解析”步骤,或者(等效地)删除“转义”步骤,对于包含转义XML的文本节点...除了某些{{1 }}第

快速而肮脏的方法是通过在这些文本节点上使用disable-output-escaping(DOE)来删除“转义”步骤。你可以使用像“contains(。,'&lt;')”之类的测试来确定在序列化过程中哪些文本节点不可用。

然而,出于各种原因,DOE通常不推荐。一个原因是它不一定是便携式的 - XSLT处理器不需要尊重它,有些则不能。另一个原因是您尝试输出XML,同时将其视为非XML文本(使用字符串而不是树)。当你这样做时,你需要的东西与处理器的作用之间必然存在不匹配。

此外,美国能源部不会解决你有一些&lt;你不想忘记的实例和你做的其他实例的问题。它将无处可见。

更强大的答案是让XSLT将字符串解析为实际的XML节点,然后输出它们。理论上,您可以使用&lt;在XSLT中执行此操作。但是,您可能最好使用以其他语言编写的自定义扩展函数(请参阅here)。我认为在XSLT中解析XML的任何现有实现(例如<xsl:analyze-string>扩展函数)都不会起作用,除非您预处理输入文本,因为您的输入文本不是格式良好的XML。

为了成功实现这一点,您需要准确指定如何确定数据中的saxon:parse()是否应该被解释为XML标记。