首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换<和>

转换<和>
EN

Stack Overflow用户
提问于 2012-09-08 02:23:48
回答 1查看 4.6K关注 0票数 1

我有一个下面的xml数据

代码语言:javascript
复制
<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脚本,该脚本将产生以下输出

代码语言:javascript
复制
<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>

我想过像这样使用包机地图

代码语言:javascript
复制
<xsl:character-map name="a">
<xsl:output-character character="&lt;" string="&lt;"/>
<xsl:output-character character="&gt;" string=">"/>
</xsl:character-map>

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-08 03:32:12

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

最快捷的方法是在这些文本节点上使用停用-输出-转义(DOE)来删除“转义”步骤。您可以使用"contains(.,'<')“这样的测试来确定在序列化过程中要取消转义的文本节点。

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

此外,DOE不会解决这样的问题,即您有一些您不想取消转义的&lt;实例,以及您想要取消转义的其他实例。它将不会逃脱所有的情况。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12323446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档