如何借助 XSLT 取消转义转义 XML 内容?

2024-04-24

我的问题是如何取消转义已经转义的 xml。

我尝试了 Tomalak 提供的代码来响应如何借助 XSLT 转义 XML 字符? https://stackoverflow.com/questions/2463155/how-to-unescape-xml-characters-with-help-of-xslt,但我无法让它做我想做的事。

我有 SoapMsg Xml。主体包含一些元素,其中之一是字符串。这个字符串 包含转义 XML。这通常在 RPC SoapMsg 中完成,因为它们不允许复杂的 类型。为了解决这个问题,他们将 Escaped-Xml 嵌入到字符串元素中,请参阅sXml参数在下面的输入中。

输入示例:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:pan="http://wsdl.somebody.com/Stuff/">
  <soap:Header />
  <soap:Body>
    <pan:SomeCommand>
      <first>eefbb52a0fee443cbda838caffbc2654</first>
      <second>f26eb2f5dabc457ca045e64585f7b185</second>
      <sXmlParameters>&lt;PARAMETERS&gt;&lt;TIMEOUTDATETIME&gt;2011-03-15
        2:09:48.997&lt;/TIMEOUTDATETIME&gt;&lt;/PARAMETERS&gt;</sXmlParameters>
    </pan:SomeCommand>
  </soap:Body>
</soap:Envelope>

我也看到这个数据转义了<![CDATA[>]]>,我也需要取消转义。

转换后的输出:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:pan="http://wsdl.somebody.com/Stuff/">
  <soap:Header />
  <soap:Body>
    <pan:SomeCommand>
      <first>eefbb52a0fee443cbda838caffbc2654</first>
      <second>f26eb2f5dabc457ca045e64585f7b185</second>
      <sXmlParameters>
        <PARAMETERS>
           <TIMEOUTDATETIME>2011-03-15 2:09:48.997</TIMEOUTDATETIME>
        </PARAMETERS>
      </sXmlParameters>
    </pan:SomeCommand>
  </soap:Body>
</soap:Envelope>

这已经解决了你一半的问题——而不是 CDATA 部分:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

    <xsl:template match="//sXmlParameters">
        <xsl:copy>
            <xsl:call-template name="unescape">
                <xsl:with-param name="escaped" select="string(.)"/>
            </xsl:call-template>
        </xsl:copy>
    </xsl:template>

    <xsl:template name="unescape">
        <xsl:param name="escaped"/>
        <xsl:choose>
            <xsl:when test="contains($escaped,'&lt;')">
                <xsl:variable name="beforeelem" select="substring-before($escaped,'&lt;')"/>
                <xsl:variable name="elemname1" select="substring-before(substring-after($escaped,'&lt;'),' ')"/>
                <xsl:variable name="elemname2" select="substring-before(substring-after($escaped,'&lt;'),'&gt;')"/>
                <xsl:variable name="elemname3" select="substring-before(substring-after($escaped,'&lt;'),'/&gt;')"/>
                <xsl:variable name="hasattributes" select="string-length($elemname1) &gt; 0 and ((string-length($elemname2)=0 or string-length($elemname1) &lt; string-length($elemname2)) and (string-length($elemname3)=0 or string-length($elemname1) &lt; string-length($elemname3)))"/>
                <xsl:variable name="elemclosed" select="string-length($elemname3) &gt; 0 and (string-length($elemname2)=0 or string-length($elemname3) &lt; string-length($elemname2))"/>
                <xsl:variable name="elemname">
                    <xsl:choose>
                        <xsl:when test="$hasattributes">
                            <xsl:value-of select="$elemname1"/>
                        </xsl:when>
                        <xsl:when test="not($elemclosed)">
                            <xsl:value-of select="$elemname2"/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="$elemname3"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>
                <xsl:variable name="elemclosetag" select="concat('&lt;/',$elemname,'&gt;')"/>
                <xsl:variable name="innercontent">
                    <xsl:if test="not($elemclosed)">
                        <xsl:call-template name="skipper-before">
                            <xsl:with-param name="source" select="substring-after(substring-after($escaped,'&lt;'),'&gt;')"/>
                            <xsl:with-param name="delimiter" select="$elemclosetag"/>
                        </xsl:call-template>
                    </xsl:if>
                </xsl:variable>
                <xsl:variable name="afterelem">
                    <xsl:choose>
                        <xsl:when test="not($elemclosed)">
                            <xsl:call-template name="skipper-after">
                                <xsl:with-param name="source" select="substring-after(substring-after($escaped,'&lt;'),'&gt;')"/>
                                <xsl:with-param name="delimiter" select="$elemclosetag"/>
                            </xsl:call-template>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="substring-after(substring-after($escaped,'&lt;'),'/&gt;')"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>
                <xsl:element name="{$elemname}">
                    <xsl:if test="$hasattributes">
                        <xsl:call-template name="unescapeattributes">
                            <xsl:with-param name="escapedattributes">
                                <xsl:choose>
                                    <xsl:when test="not($elemclosed)">
                                        <xsl:value-of select="normalize-space(substring-after($elemname2,' '))"/>
                                    </xsl:when>
                                    <xsl:otherwise>
                                        <xsl:value-of select="normalize-space(substring-after($elemname3,' '))"/>
                                    </xsl:otherwise>
                                </xsl:choose>
                            </xsl:with-param>
                        </xsl:call-template>
                    </xsl:if>
                    <xsl:call-template name="unescape">
                        <xsl:with-param name="escaped" select="$innercontent"/>
                    </xsl:call-template>
                </xsl:element>
                <xsl:call-template name="unescape">
                    <xsl:with-param name="escaped" select="$afterelem"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="unescapetext">
                    <xsl:with-param name="escapedtext" select="$escaped"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="unescapeattributes">
        <xsl:param name="escapedattributes"/>
        <xsl:variable name="attrname" select="substring-before($escapedattributes,'=')"/>
        <xsl:variable name="attrquote" select="substring($escapedattributes,string-length($attrname)+2,1)"/>
        <xsl:variable name="attrvalue" select="substring-before(substring-after($escapedattributes,$attrquote),$attrquote)"/>
        <xsl:variable name="afterattr" select="substring-after(substring-after($escapedattributes,$attrquote),$attrquote)"/>
        <xsl:attribute name="{$attrname}">
            <xsl:call-template name="unescapetext">
                <xsl:with-param name="escapedtext" select="$attrvalue"/>
            </xsl:call-template>
        </xsl:attribute>
        <xsl:if test="contains($afterattr,'=')">
            <xsl:call-template name="unescapeattributes">
                <xsl:with-param name="escapedattributes" select="normalize-space($afterattr)"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

    <xsl:template name="unescapetext">
        <xsl:param name="escapedtext"/>
        <xsl:call-template name="string-replace-all">
            <xsl:with-param name="text">
                <xsl:call-template name="string-replace-all">
                    <xsl:with-param name="text">
                        <xsl:call-template name="string-replace-all">
                            <xsl:with-param name="text" select="$escapedtext"/>
                            <xsl:with-param name="replace">&amp;gt;</xsl:with-param>
                            <xsl:with-param name="by">&gt;</xsl:with-param>
                        </xsl:call-template>
                    </xsl:with-param>
                    <xsl:with-param name="replace">&amp;lt;</xsl:with-param>
                    <xsl:with-param name="by">&lt;</xsl:with-param>
                </xsl:call-template>
            </xsl:with-param>
            <xsl:with-param name="replace">&amp;amp;</xsl:with-param>
            <xsl:with-param name="by">&amp;</xsl:with-param>
        </xsl:call-template>
    </xsl:template>

    <!-- replaces substrings in strings -->
    <xsl:template name="string-replace-all">
        <xsl:param name="text"/>
        <xsl:param name="replace"/>
        <xsl:param name="by"/>
        <xsl:choose>
            <xsl:when test="contains($text, $replace)">
                <xsl:value-of select="substring-before($text,$replace)"/>
                <xsl:value-of select="$by"/>
                <xsl:call-template name="string-replace-all">
                    <xsl:with-param name="text" select="substring-after($text,$replace)"/>
                    <xsl:with-param name="replace" select="$replace"/>
                    <xsl:with-param name="by" select="$by"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$text"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- returns the substring after the last delimiter -->
    <xsl:template name="skipper-after">
        <xsl:param name="source"/>
        <xsl:param name="delimiter"/>
        <xsl:choose>
            <xsl:when test="contains($source,$delimiter)">
                <xsl:call-template name="skipper-after">
                    <xsl:with-param name="source" select="substring-after($source,$delimiter)"/>
                    <xsl:with-param name="delimiter" select="$delimiter"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$source"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- returns the substring before the last delimiter -->
    <xsl:template name="skipper-before">
        <xsl:param name="source"/>
        <xsl:param name="delimiter"/>
        <xsl:param name="result"/>
        <xsl:choose>
            <xsl:when test="contains($source,$delimiter)">
                <xsl:call-template name="skipper-before">
                    <xsl:with-param name="source" select="substring-after($source,$delimiter)"/>
                    <xsl:with-param name="delimiter" select="$delimiter"/>
                    <xsl:with-param name="result">
                        <xsl:if test="result!=''">
                            <xsl:value-of select="concat($result,$delimiter)"/>
                        </xsl:if>
                        <xsl:value-of select="substring-before($source,$delimiter)"/>
                    </xsl:with-param>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$result"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

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

如何借助 XSLT 取消转义转义 XML 内容? 的相关文章

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

    使用 XSLT 2 0 转换 XML 时如何保留实体引用 对于我尝试过的所有处理器 默认情况下都会解析实体 我可以用xsl character map处理字符实体 但是文本实体呢 例如 这个 XML gt
  • 创建一个分层的 xml 形式,形成一个类似于书籍描述的“平面”xml

    这是一个后续问题 选择当前元素和当前元素的下一个元素之间的所有元素 https stackoverflow com q 16145859 2115381 即使我不确定创建一个新问题是否是正确的方法 但我还是这样做 因为原来的问题已经回答了
  • 使用 Cdata 内的 XSLT 1.0 删除 xml 声明 ()

    我从 SharePoint 应用程序收到这样的响应 Input
  • 如何用 Java 从 XML 创建 PDF?

    目前 我正在 Java 中创建一个 XML 文件 并通过使用 XSL XSLT 对其进行转换来将其显示在 JSP 页面中 现在我需要获取该 XML 文件并在 PDF 中显示相同的信息 有没有办法通过使用某种 XSL 文件来做到这一点 我见过
  • 如何使用 XSL 在 Mozilla 中显示。

    我怎样才能显示 nbsp 在 Mozilla 中使用 XSL 我尝试过 CDATA 但没有成功 我使用的是火狐浏览器3 5 5 因为您无法将 HTML 字符实体直接放入 XSLT 源中 除了 lt gt apos quot and amp
  • 在 lxml 中定义默认命名空间(无前缀)

    当使用 lxml 渲染 XHTML 时 一切都很好 除非您碰巧使用 Firefox 它似乎无法处理以名称空间为前缀的 XHTML 元素和 javascript 虽然 Opera 能够很好地执行 javascript 这适用于 jQuery
  • 我可以为 XPath 中缺失的标签创建一个值吗?

    我有一个使用 XPath 从 XML 文件中提取数据的应用程序 如果该 XML 源文件中的节点丢失 我想返回值 N A 很像 Oracle NVL 函数 问题在于该应用程序不支持 XSLT 我想使用 XPath 和单独使用 XPath 来完
  • 由于命名空间“xmlns”,无法使用 XSLT 转换 XML

    我一直在尝试使用 XSLT 转换 XML 文件 但由于一些问题 即 xmlns 它没有转换 我 一辈子都找不到问题所在 XML 文件
  • XSLT 是 Web 框架的好选择吗?

    我一直认为 XML 以及之前的 SGML 数据是魔鬼的格式 我是旧数据库和平面文件学校的 尽管如此 我们正在开发一款商用网络产品 其框架基于在链中翻译 转换 XML 数据 当我们面试职位以及与潜在客户交谈时 他们喜欢它将做什么的概念 但厌倦
  • xsl:for-each 循环内的计数器

    如何在 xsl for each 循环内获取一个计数器 该计数器将反映当前处理的元素的数量 例如我的源 XML 是
  • XSLT 2.0 中的简洁正则表达式提取功能

    我可以从 XSLT 2 0 文档中看到最好的结果 或者至少从我在这些地方读到的内容中看到 Saxon 分析字符串函数 http www saxonica com html documentation xsl elements analyze
  • XSL。评估表达

    对不起我的英语不好 XSL 1 0 如何从元素或属性值计算表达式 例如 XML
  • XSLT 分组/合并子项(使用密钥)

    我试图了解如何使用我已经编写的代码推导出解决方案 为了简化起见 我将首先解释我想要做什么以及到目前为止我得到了什么 假设我在 XSLT 中有一个 XML 变量 其中包含几个具有相同标题属性的节点 Using Dimitre Novatche
  • 使用 XSLT 从文本文件中删除第一行

    我正在使用一个生成文本文件的系统 Maximo 我需要删除文件的第一行 做到这一点的方法应该是使用 XSLT 任何想法 是的 您可以在 XSLT 中完成您想要的事情 如果您可以选择的话 在 XSLT 2 0 中这样做可能会更容易 Micha
  • Xslt 到 xsl-fo 转换

    我想将 xslt 转换为 xsl fo 但我不太确定我能做到这一点 我尝试将 XML 列表转换为 xsl fo 列表 谁能告诉我在哪里可以找到我在谷歌上搜索了很长时间没有很多这样的例子 我的XML是这样的 p TEXT p ul li It
  • XSLT key() 查找

    我正在尝试 XSLT 中的查找表示例 但无法使其工作
  • 编写 XSLT 分组

    我有一个简单的 XML 其中包含两个级别 标题和行 标签 例如
  • 在 XSL 中测试 xs:decimal 的正确方法是什么?

    我试图根据传入的数据显示不同的信息 如果它是整数 我想只显示数字 如果它是小数 我想使用 0 00 模式 是的 我知道 有点混乱 但这就是开发规范 gt 对于这个特定部分 我有以下 XSL 但我无法看到 xsl when 错误消息 预期的表
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过
  • 如何在另一个 XML 中使用 CDATA 中包装的 XML 进行 XSL 转换?

    XML 文档包含另一个 XML 元素 该元素包装在 CDATA 中 包装的 XML 如何用于 XSL 和 XSL FO 转换 版本 1 如果您愿意采取多个转型步骤 那么这是可能的 使用disable output escaping输出相关部

随机推荐

  • Apache 错误:地址已在使用中:make_sock:无法绑定到地址 [::]:443

    Apache 启动时出错 Address already in use make sock could not bind to address 443 Executing start method lib svc method http a
  • Spring安全和特殊字符

    我需要通过 url 在用户名和 或密码中使用特殊字符使用 j spring security check 登录 http localhost 8080 appname j spring security check j username u
  • 在 R 中解析和评估字符串表达式的列?

    如何将 R 中的一列字符串表达式作为管道的一部分进行解析和求值 在下面的示例中 我生成了所需的列 evaluated 但我知道这不是正确的做法 我尝试采取 tidyverse 方法 但我只是很困惑 library tidyverse df
  • 如何在 Docker SQL Server 映像上运行安装脚本?

    我正在尝试在 Docker SQL Server 映像上运行安装脚本 为此 我从 mssql 映像创建了一个 Dockerfile FROM microsoft mssql server linux 2017 CU8 Create dire
  • 有没有好的 AS3 代码片段/示例的指针?

    我是 AS3 的新手 每天都在学习 我正在寻找好的 AS3 代码片段 示例 小项目 我可以将其用于学习目的和参考 不依赖于 Flash IDE 因为我使用 Flex SDK 和 Flash Develop 此外 我还专门寻找有关音频 视频流
  • jQuery/AJAX - 单击按钮时将内容加载到 div 中?

    有人可以在这里提供帮助吗 我想填充一个div 例如 div div 包含来自外部文件的内容 例如 includes about info html 当单击某个类别的按钮时 例如 p class classloader Click Here
  • 保存实体会导致重复插入到查找数据中

    我使用 EF 4 1 代码优先 来创建我的数据库和对象 Given public class Order public int Id get set public string Name get set public virtual Ord
  • 绕过 InAppBrowser Cordova 插件中的 SSL 错误

    我已在 Cordova 项目中添加了一个 InAppBrowser 插件来访问站点并获取令牌 但是虽然该站点在桌面浏览器中正常打开 但从移动浏览器打开时却出现错误 此外 默认的本机浏览器会在出现 SSL 错误时要求继续 但 Cordova
  • 微软动态 - Web API

    我正在尝试通过 Web API 在 Dynamics 365 实例中创建一个新的 事件 案例 在我的http请求中 我不知道哪个字段是必填的 我尝试仅添加标题 主题和客户 但返回 Http 400 错误 我正在使用 Postman 尝试我的
  • 为什么 console.dir('') 打印“无属性”?

    我的印象是字符串具有属性 例如match 为什么console dir 声称 没有属性 至少在 Google Chrome 中 这是因为 是一个字符串文字 而不是一个实例String 班级 由于属性如match宣布于String proto
  • 双击 Selenium 的 javascript 执行

    有一种方法可以通过执行 javascript 来单击元素 如下所示 JavascriptExecutor driver executeScript arguments 0 click element 我想通过执行 JavaScript 来双
  • 允许在 Google 计算引擎 (GCE) 中使用 WebSocket

    我正在使用计算引擎 GCE 通过 Socket IO Node js 运行我的套接字服务器 它仅适用于轮询 当我尝试使用网络客户端时 我收到以下错误代码 WebSocket connection to ws myapp socket app
  • Swift:Switch 语句失败行为

    目前我有这个 let somePoint 1 0 switch somePoint case 0 0 print origin does not print fallthrough case 0 print y axis prints y
  • 如何将路径图像用户存储到数据库中:Codeigniter

    我正在尝试将不同用户的图片路径上传到数据库中 我对 codeigniter 很陌生 并且阅读了很多教程 但我仍然在挣扎 这是我的控制器 但我什至不知道如何将图像与用户会话链接 这是我的代码 function do upload config
  • 将私有 GitLab 的依赖项与 NPM 结合使用

    我正在尝试从私有 GitLab 实例安装 NPM 依赖项 所以 我有带有基本文件的存储库 我在中添加了这个依赖项package json在我的项目上 node demo package https oauth2
  • 通过ajax请求提交html表单? [复制]

    这个问题在这里已经有答案了 可能的重复 jQuery AJAX 提交表单 https stackoverflow com questions 1960240 jquery ajax submit form 我在页面 A 上有一个表单 而不是
  • 在 Three.js 中渲染具有大量对象的多个场景的最佳方式

    想象一下 您想要绘制两个场景 每个场景都有数百个球体 并提供在这些场景之间切换的功能 做到这一点的最佳方法是什么 目前 一个开关大约需要 4 到 5 秒 因为我要删除 创建和绘制每个开关上的所有球体 下面是在场景切换上运行的代码示例 cle
  • 如何在react redux中实现一个自包含组件?

    我正在基于react redux构建一个文件管理器webui 我的目的是通过这个项目掌握react和redux 如您所知 文件管理器需要一个树浏览器 我想构建一个可以包含它自己并且每个都有自己状态的组件 像下面这样 TreeNode可以包含
  • Chrome 是否已停止支持 Intl 函数?

    我使用的是 Chrome 浏览器 版本 92 0 4515 131 我发现对 JavaScript Intl 的支持不能正常运行Chrome浏览器 const formattedDate new Intl DateTimeFormat nb
  • 如何借助 XSLT 取消转义转义 XML 内容?

    我的问题是如何取消转义已经转义的 xml 我尝试了 Tomalak 提供的代码来响应如何借助 XSLT 转义 XML 字符 https stackoverflow com questions 2463155 how to unescape