2012-09-07 58 views
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> 

所以bascially与<text>更换&lt;text class="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;

+0

什么是'< 123;'?在那里,对于任何自动化流程来说,区分应该是XML标记还是没有标记是很困难的。 – LarsH

+0

确定哪些'<'你不想失踪的逻辑规则是什么? – LarsH

+0

如果我们没有匹配>则忽略它。 – atif

回答

3

什么你'要求做的是为包含转义XML的文本节点添加一个额外的“解析”步骤或(对等地)删除“转义”步骤,除了某些&lt; s。

快速和肮脏的方法是通过在这些文本节点上使用禁用输出转义(DOE)来删除“转义”步骤。您可以使用像“contains(。,'<')”这样的测试来确定在序列化过程中要使用哪些文本节点。

但是,美国能源部往往是不建议出于各种原因。其中一个原因是它不一定是可移植的 - XSLT处理器不需要遵守它,有些则不能。另一个原因是你试图输出XML,而把它当作非XML文本(使用字符串而不是树)。当你这样做的时候,你需要什么和处理器会做什么之间肯定会有不匹配。

此外,DOE不会解决您有一些您不想隐藏的&lt;实例以及您所做的其他实例的问题。它会忽略所有实例。

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

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

相关问题