我有一个下面的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>
我想过像这样使用包机地图
<xsl:character-map name="a">
<xsl:output-character character="<" string="<"/>
<xsl:output-character character=">" string=">"/>
</xsl:character-map>但这种方法的问题是,它将所有<转换为<,这会导致我们不想像上面的<123;那样替换它的地方出现问题
发布于 2012-09-08 03:32:12
您要求做的是为包含转义XML的文本节点添加一个额外的“解析”步骤,或者(相当于)删除一个“转义”步骤……但某些<除外。
最快捷的方法是在这些文本节点上使用停用-输出-转义(DOE)来删除“转义”步骤。您可以使用"contains(.,'<')“这样的测试来确定在序列化过程中要取消转义的文本节点。
然而,由于各种原因,DOE通常是不推荐的。一个原因是它不一定是可移植的- XSLT处理程序不需要遵守它,有些则不能。另一个原因是您试图输出XML,同时将其视为非XML文本(使用字符串而不是树)。当你这样做的时候,你需要的东西和处理器将要做的事情之间肯定会有不匹配。
此外,DOE不会解决这样的问题,即您有一些您不想取消转义的<实例,以及您想要取消转义的其他实例。它将不会逃脱所有的情况。
更健壮的答案是让XSLT将字符串解析为实际的XML节点,然后输出这些节点。从理论上讲,可以使用<xsl:analyze-string>在XSLT中做到这一点。但是您最好使用用另一种语言编写的自定义扩展函数(请参阅here)。我认为,除非对输入文本进行预处理,否则任何现有的用于在XSLT中解析XML的实现(比如saxon:parse()扩展函数)都不会起作用,因为您的输入文本不是格式良好的XML。
为了成功地实现这一点,您需要准确地指定如何决定数据中的<是否应该被解释为XML标记。
https://stackoverflow.com/questions/12323446
复制相似问题