1

我有一个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>

我想过像这样使用宪章映射

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

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

4

1 回答 1

3

您要求做的是为包含转义 XML 的文本节点添加一个额外的“解析”步骤,或者(相当于)删除一个“转义”步骤......除了某些&lt;s.

快速而简单的方法是通过在这些文本节点上使用禁用输出转义 (DOE) 来删除“转义”步骤。您可以使用“contains(., '<')”之类的测试来确定在序列化过程中要取消转义的文本节点。

但是,由于各种原因,通常不推荐DOE。一个原因是它不一定是可移植的——XSLT 处理器不需要支持它,有些则不能。另一个原因是您试图输出 XML,同时将其视为非 XML 文本(使用字符串而不是树)。当你这样做时,你需要的东西和处理器将做的事情之间必然会出现不匹配。

此外,DOE 不会解决您有一些&lt;您不想逃避的实例以及您想要逃避的其他实例的问题。它会取消所有实例。

更可靠的答案是让 XSLT 将字符串解析为实际的 XML 节点,然后输出这些节点。理论上,您可以在 XSLT 中使用<xsl:analyze-string>. 但是您最好使用用另一种语言编写的自定义扩展函数(参见此处)。我认为在 XSLT 中解析 XML 的任何现有实现(例如saxon:parse()扩展函数)都不会起作用,除非您预处理输入文本,因为您的输入文本不是格式正确的 XML。

为了成功实现这一点,您需要准确指定如何确定&lt;数据中的 an 是否应被解释为 XML 标记。

于 2012-09-07T19:32:12.340 回答