使用 XSLT 转换 XML 时保留实体引用?

2024-04-16

使用 XSLT (2.0) 转换 XML 时如何保留实体引用?对于我尝试过的所有处理器,默认情况下都会解析实体。我可以用xsl:character-map处理字符实体,但是文本实体呢?

例如,这个 XML:

<!DOCTYPE doc [
<!ENTITY so "stackoverflow">
<!ENTITY question "How can I preserve the entity reference when transforming with XSLT??">
]>
<doc>
  <text>Hello &so;!</text>
  <text>&question;</text>
</doc>

使用以下 XSLT 进行转换:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

产生以下输出:

<doc>
   <text>Hello stackoverflow!</text>
   <text>How can I preserve the entity reference when transforming with XSLT??</text>
</doc>

输出应该与输入类似(暂时减去 doctype 声明):

<doc>
  <text>Hello &so;!</text>
  <text>&question;</text>
</doc>

I'm hoping我不必通过将所有&符号替换为来预处理输入&amp; (like &amp;question;),然后通过替换所有内容来对输出进行后处理&amp; with &.

也许这是特定于处理器的?我正在使用撒克逊9。

Thanks!


如果您知道将使用哪些实体以及它们是如何定义的,您可以执行以下操作(相当原始且容易出错,但总比没有好):

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:character-map name="mapEntities">
  <xsl:output-character character="&amp;" string="&amp;"/>
 </xsl:character-map>

 <xsl:variable name="vEntities" select=
 "'stackoverflow',
 'How can I preserve the entity reference when transforming with XSLT\?\?'
 "/>

 <xsl:variable name="vReplacements" select=
 "'&amp;so;', '&amp;question;'"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="/">
  <xsl:text disable-output-escaping="yes"><![CDATA[<!DOCTYPE doc [ <!ENTITY so "stackoverflow">
<!ENTITY question
"How can I preserve the entity reference when transforming with XSLT??"> ]>
]]>
  </xsl:text>

  <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="text()">
  <xsl:value-of select=
  "my:multiReplace(.,
                   $vEntities,
                   $vReplacements,
                   count($vEntities)
                   )
  " disable-output-escaping="yes"/>
 </xsl:template>

 <xsl:function name="my:multiReplace">
  <xsl:param name="pText" as="xs:string"/>
  <xsl:param name="pEnts" as="xs:string*"/>
  <xsl:param name="pReps" as="xs:string*"/>
  <xsl:param name="pCount" as="xs:integer"/>

  <xsl:sequence select=
  "if($pCount > 0)
     then
      my:multiReplace(replace($pText,
                              $pEnts[1],
                              $pReps[1]
                              ),
                      subsequence($pEnts,2),
                      subsequence($pReps,2),
                      $pCount -1
                      )
      else
       $pText
  "/>
 </xsl:function>
</xsl:stylesheet>

当应用于提供的 XML 文档时:

<!DOCTYPE doc [ <!ENTITY so "stackoverflow">
<!ENTITY question
"How can I preserve the entity reference when transforming with XSLT??"> ]>
<doc>
    <text>Hello &so;!</text>
    <text>&question;</text>
</doc>

产生了想要的结果:

<!DOCTYPE doc [ <!ENTITY so "stackoverflow">
<!ENTITY question
"How can I preserve the entity reference when transforming with XSLT??"> ]>

  <doc>
      <text>Hello &so;!</text>
      <text>&question;</text>
</doc>

Do note:

  1. 替换中的特殊 (RegEx) 字符必须进行转义。

  2. 我们需要解析为 DOE,但不建议这么做,因为它违反了 XSLT 架构和处理模型的原则——换句话说,这个解决方案是一个令人讨厌的 hack。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 XSLT 转换 XML 时保留实体引用? 的相关文章

随机推荐

  • 如何为 casper.repeat 设置变量值

    我想根据来自运行 CasperJS 的页面的变量值重复使用 CasperJS 的步骤 为了获得这个值 我做了类似的事情 casper waitForSelector xxxx function myvalue this evaluate f
  • iOS 绑定 javascript 函数来点击

    这在桌面 safari 中有效 但在 iOS 版本中不会弹出警报 是否可以绑定到 iOS 中的 html 元素 每当用户单击页面上的其他位置时 我想关闭下拉菜单 html bind click function alert clicked
  • 如何在 iPhone 上的 ViewController 之间共享对象?

    我的应用程序是一个选项卡栏应用程序 每个选项卡都有一个单独的视图控制器 我的第一个视图控制器 A 中有一个对象 其中包含我存储的所有应用程序数据 请忽略 NSUserDefaults 当我按下第二个视图控制器 B 上的按钮时 需要由第二个视
  • 在 Spark 中,从哈希映射创建数据帧,其中键作为列名称,值作为行

    我有一个数据框 我有一个列 它是数据框中的地图 如下所示 scala gt df printSchema root A1 map nullable true key string value string valueContainsNull
  • 无法从 vs 2015 安装程序安装 xamarin

    我安装了 vs 2015 升级 1 并尝试从设置中安装 Xamarin 但是当我尝试安装它时 最后收到此错误消息 C Net Xamarin 安装程序在安装此软件包时遇到意外错误 这可能表明软件包有问题 错误代码为2711 我该如何解决这个
  • 订购 NSURL 数组

    我正在将大量图像路径加载到 NSURL 中 这些图像位于按 1 PNG 2 PNG 3 PNG 到 1500 PNG 顺序排列的文件夹中 当我尝试加载它们时 let imagePath path images let url NSURL f
  • 扩展 ActiveStorage::Attachment - 添加自定义字段

    我想扩展 ActiveStorage Attachment 类并添加一个枚举属性以实现附件的可见性 我最初的方法是在 app models 目录中创建一个新文件attachment rb 如下所示 class ActiveStorage A
  • 如何使用 Odoo 从表单字段获取值?

    我在表单视图中有这个字段
  • 测试入口点贡献

    我正在编写一个指定一组入口点的 Python 模块 以便其他主机模块可以发现新的功能 我正在遵循指定的 setuptools 方法官方文档 https setuptools readthedocs io en latest userguid
  • Python - 使 gspread.service_account 采用 python 字典或字符串而不是文件名

    我目前正在使用 google Sheets 并正在使用 python 库gspread使其自动化 我的代码的第一行是导入 gspread 库并使用以下命令登录到服务帐户service account json谷歌控制台给我们的文件 impo
  • TypeScript/TSLint:TSLint 无法通过 baseUrl 识别根相对导入

    我通过以下方式使用根相对导入baseUrl编译器选项在tsconfig json 按照这个解决方案 https stackoverflow com a 42306860 1253298 但我遇到了一个问题 Atom IDE 向我显示如下所示
  • 有没有办法使用 Cereal / C++ 为 std::map 指定更简单的 JSON(反)序列化?

    我正在从事的项目是一个管理大量自定义硬件设备的 C 应用程序 该应用程序有一个供客户端使用的套接字 端口接口 如 GUI 每种设备类型都有自己定义良好的 JSON 模式 我们可以使用 Cereal 来序列化这些模式 但应用程序还需要解析来自
  • 了解 T-SQL stdev、stdevp、var 和 varp

    我很难理解这些统计函数的作用以及它们的工作原理 我很难理解 stdev 与 stdevp 以及 var 等价物的工作原理 有人可以帮我把这些分解成愚蠢的吗 在统计学中 标准差和方差是衡量总体中的指标偏离平均值 通常是平均值 的程度 标准差定
  • 违反 - 未找到父键错误

    我出现以下错误 INSERT INTO GroupMembers VALUES Goldfrat Simon Palm ERROR at line 1 ORA 02291 integrity constraint SHAHA1 IAM IS
  • VS2010/C#4 的 C# 编译器错误 CS1628

    此编译器错误列在 C 编译器错误中MSDN http msdn microsoft com en us library we3011f5 28v vs 90 29 aspx适用于 VS2005 和 VS2008 但不适用于较新的版本 这会让
  • iOS VoiceOver“找不到标题”

    我有一个 UITableView 其中每个 UITableViewCell 有 2 个 UILabels 1 个标题和 1 个内容 标头的 AccessibilityTrait 设置为 header 使用辅助功能检查器检查模拟器屏幕时 我能
  • 如何在React功能组件中添加事件

    我有一个关于 React 函数式组件的问题 特别是关于函数式组件中的函数的问题 例如 import React useEffect from react const Component props gt useEffect gt windo
  • 扫描新指纹时如何触发KeyPermanentlyInvalidatedException

    如上所述here https stackoverflow com a 44926774 3142611 我正在尝试触发KeyPermanentlyInvalidatedException当新的指纹添加到设备但未触发此异常时 MyCode F
  • Python 中可用和已使用的系统内存? [复制]

    这个问题在这里已经有答案了 如何从 Python 获取可用和当前使用的内存 它需要是跨平台的 并且至少可以在 Windows Mac OS X 和 Linux 上运行 我想向我的应用程序中的用户报告没有足够的可用内存来继续 你应该看看psu
  • 使用 XSLT 转换 XML 时保留实体引用?

    使用 XSLT 2 0 转换 XML 时如何保留实体引用 对于我尝试过的所有处理器 默认情况下都会解析实体 我可以用xsl character map处理字符实体 但是文本实体呢 例如 这个 XML gt