本文介绍了通过多次转换替换和维护角色实体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题:我们的系统中有各种格式的字符实体(例如:&&),我们需要转换如果需要,将它们转换为标准的 XML 字符实体(&amp < > ' "),然后通过几个单独的转换将它们作为实体进行维护.

Problem: We have character entities come to our systems in various formats (Ex: & and &) and we need to convert them to a standard XML character entities if needed (&amp < > ' ") and then maintain them as entities through a couple of separate tranformations.

给定的 XML:

<rootelm>
 <testdata>&amp;apos; &amp;gt; &amp;lt; &amp;quot;</testdata>
</rootelm>

和样式表(基于 xsl:character-map 替换特殊字符):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
 <!-- COPY EVERYTHING -->
 <xsl:template match="node() | @*">
  <xsl:copy>
   <xsl:apply-templates select="@* | node()">
    <xsl:sort select="local-name()"/>
   </xsl:apply-templates>
  </xsl:copy>
 </xsl:template>
 <xsl:variable name="quote">
  <xsl:text>&amp;quot;</xsl:text>
 </xsl:variable>
 <xsl:variable name="quote2">
  <xsl:value-of select="string('&quot;')"/>
 </xsl:variable>
 <xsl:template match="text()[contains(.,'&amp;lt;') or contains(.,'&amp;gt;') or contains(.,'&amp;quot;') or contains(.,'&amp;apos;')]">
  <xsl:value-of select='replace(
  replace(
   replace(
    replace(., "&amp;lt;", "&lt;"),
   "&amp;gt;",
   "&gt;"
   ),
  "&amp;apos;",
  "&apos;"
  ),
  $quote,
  $quote2
 )
    ' />
 </xsl:template>
</xsl:stylesheet>

如何将撇号和引号保留为实体(源系统需要/需要它)?

How can I keep the apostrophe's and quotes as entities (source system expects/needs it)?

电流输出:

<rootelm> 
   <testdata>' &gt; &lt; "</testdata>
</rootelm>

推荐答案

使用 Character Maps :

[定义:字符映射允许出现在文本中的特定字符或最终结果中的属性节点树被指定的替代期间的字符串序列化.]

<xsl:character-map name="quotes">
  <xsl:output-character character='"' string="&amp;quot;"/>   
  <xsl:output-character character="'" string="&amp;apos;"/>
</xsl:character-map>

这篇关于通过多次转换替换和维护角色实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-30 09:43