我有一个followig xml数据
<xml>
<para>
<number>1</number>
<text class="text">the cost to the <123; each capital property <a href="none" num="88(1)">88(1)</a> and (1.7) </text>
</para>
我想运行一个xslt脚本,它将提供以下输出
<xml>
<para>
<number>1</number>
<text class="text">the cost to the <123; each capital property <a href="none" num="88(1)">88(1)</a> and (1.7) </text>
</para>
</xml>
所以用<text class="text">
和<text>
替换</text>
和</text>
我想过像这样使用包机maping
<xsl:character-map name="a">
<xsl:output-character character="<" string="<"/>
<xsl:output-character character=">" string=">"/>
</xsl:character-map>
但是这种方法的问题在于它会将所有<
转换为<
,导致我们不想像上面<123;
答案 0 :(得分:3)
您要求做的是添加一个额外的“解析”步骤,或者(等效地)删除“转义”步骤,对于包含转义XML的文本节点...除了某些{{1 }}第
快速而肮脏的方法是通过在这些文本节点上使用disable-output-escaping(DOE)来删除“转义”步骤。你可以使用像“contains(。,'&lt;')”之类的测试来确定在序列化过程中哪些文本节点不可用。
然而,出于各种原因,DOE通常不推荐。一个原因是它不一定是便携式的 - XSLT处理器不需要尊重它,有些则不能。另一个原因是您尝试输出XML,同时将其视为非XML文本(使用字符串而不是树)。当你这样做时,你需要的东西与处理器的作用之间必然存在不匹配。
此外,美国能源部不会解决你有一些<
你不想忘记的实例和你做的其他实例的问题。它将无处可见。
更强大的答案是让XSLT将字符串解析为实际的XML节点,然后输出它们。理论上,您可以使用<
在XSLT中执行此操作。但是,您可能最好使用以其他语言编写的自定义扩展函数(请参阅here)。我认为在XSLT中解析XML的任何现有实现(例如<xsl:analyze-string>
扩展函数)都不会起作用,除非您预处理输入文本,因为您的输入文本不是格式良好的XML。
为了成功实现这一点,您需要准确指定如何确定数据中的saxon:parse()
是否应该被解释为XML标记。