将 XML 转换为 XSLT 中的转义文本

2024-02-04

如何使用 XSLT 将以下 XML 转换为转义文本?

Source:

<?xml version="1.0" encoding="utf-8"?>
<abc>
  <def ghi="jkl">
    mnop
  </def>
</abc>

Output:

<TestElement>&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;abc&gt;&lt;def ghi="jkl"&gt;
    mnop
  &lt;/def&gt;&lt;/abc&gt;</TestElement>

目前,我正在尝试以下 XSLT,但它似乎无法正常工作:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="utf-8" />
  <xsl:template match="/">
    <xsl:variable name="testVar">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:variable>

    <TestElement>
      <xsl:value-of select="$testVar"/>
    </TestElement>
  </xsl:template>
</xsl:stylesheet>

.NET XslCompiledTransform 的 XSLT 语句输出如下:

<?xml version="1.0" encoding="utf-8"?><TestElement>

    mnop

</TestElement>

您的代码按照它的方式工作是因为xsl:value-of检索字符串值 http://www.w3.org/TR/xpath#dt-string-value的节点集。

为了做你想做的事,恐怕你必须明确地编码:

    <xsl:template match="/">
        <TestElement>
            <xsl:apply-templates mode="escape"/>
        </TestElement>
    </xsl:template>

    <xsl:template match="*" mode="escape">
        <!-- Begin opening tag -->
        <xsl:text>&lt;</xsl:text>
        <xsl:value-of select="name()"/>

        <!-- Namespaces -->
        <xsl:for-each select="namespace::*">
            <xsl:text> xmlns</xsl:text>
            <xsl:if test="name() != ''">
                <xsl:text>:</xsl:text>
                <xsl:value-of select="name()"/>
            </xsl:if>
            <xsl:text>='</xsl:text>
            <xsl:call-template name="escape-xml">
                <xsl:with-param name="text" select="."/>
            </xsl:call-template>
            <xsl:text>'</xsl:text>
        </xsl:for-each>

        <!-- Attributes -->
        <xsl:for-each select="@*">
            <xsl:text> </xsl:text>
            <xsl:value-of select="name()"/>
            <xsl:text>='</xsl:text>
            <xsl:call-template name="escape-xml">
                <xsl:with-param name="text" select="."/>
            </xsl:call-template>
            <xsl:text>'</xsl:text>
        </xsl:for-each>

        <!-- End opening tag -->
        <xsl:text>&gt;</xsl:text>

        <!-- Content (child elements, text nodes, and PIs) -->
        <xsl:apply-templates select="node()" mode="escape" />

        <!-- Closing tag -->
        <xsl:text>&lt;/</xsl:text>
        <xsl:value-of select="name()"/>
        <xsl:text>&gt;</xsl:text>
    </xsl:template>

    <xsl:template match="text()" mode="escape">
        <xsl:call-template name="escape-xml">
            <xsl:with-param name="text" select="."/>
        </xsl:call-template>
    </xsl:template>

    <xsl:template match="processing-instruction()" mode="escape">
        <xsl:text>&lt;?</xsl:text>
        <xsl:value-of select="name()"/>
        <xsl:text> </xsl:text>
        <xsl:call-template name="escape-xml">
            <xsl:with-param name="text" select="."/>
        </xsl:call-template>
        <xsl:text>?&gt;</xsl:text>
    </xsl:template>

    <xsl:template name="escape-xml">
        <xsl:param name="text"/>
        <xsl:if test="$text != ''">
            <xsl:variable name="head" select="substring($text, 1, 1)"/>
            <xsl:variable name="tail" select="substring($text, 2)"/>
            <xsl:choose>
                <xsl:when test="$head = '&amp;'">&amp;amp;</xsl:when>
                <xsl:when test="$head = '&lt;'">&amp;lt;</xsl:when>
                <xsl:when test="$head = '&gt;'">&amp;gt;</xsl:when>
                <xsl:when test="$head = '&quot;'">&amp;quot;</xsl:when>
                <xsl:when test="$head = &quot;&apos;&quot;">&amp;apos;</xsl:when>
                <xsl:otherwise><xsl:value-of select="$head"/></xsl:otherwise>
            </xsl:choose>
            <xsl:call-template name="escape-xml">
                <xsl:with-param name="text" select="$tail"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

请注意,此解决方案忽略注释节点,并插入不必要的命名空间节点(如namespace::轴将包括从父级继承的所有节点)。然而,关于命名空间,生成的引用 XML 在语义上与您在回复中提供的示例等效(因为这些重复的重新声明并没有真正改变任何内容)。

另外,这也无法逃脱<?xml ... ?>声明,只是因为它不存在于 XPath 1.0 数据模型中(它不是处理指令)。如果您确实在输出中需要它,则必须手动插入它(并确保它指定的编码与 XSLT 处理器的序列化编码一致)。

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

将 XML 转换为 XSLT 中的转义文本 的相关文章

随机推荐

  • JDBC 字符编码

    我有一个在 GlassFish 3 上运行的 Java Web 应用程序和在 MySQL 上运行的 JPA EclipseLink 我面临的问题是 如果我使用以下命令将实体保存到数据库中update 方法 String领域失去完整性 显示而
  • 在编译时计算小整数的阶乘

    我刚刚实现 再次 一个递归模板 用于在编译时计算整数的阶乘 谁会想到有一天我实际上会需要它 不过 我没有自己动手 而是去了Boost http www boost org 寻找答案 然而 特殊数学中的阶乘函数明确禁止将其与整数类型一起使用
  • 在Java BufferedImage中绘制完全透明的“白色”

    这可能听起来有点奇怪 但请耐心听一下 那里is一个原因 我正在尝试在灰色背景上的文本周围生成白色发光 为了生成发光 我创建了一个比文本大的新 BufferedImage 然后将白色文本绘制到图像的画布上 并通过卷积运算 http docs
  • 如何在Python中将csv转换为json?

    我对编程非常陌生 过去 3 4 周一直在学习 python 这是给出的作业之一 Input A B C D 1 2 3 4 5 6 7 8 Output A 1 B 2 C 3 D 4 A 5 B 6 C 7 D 8 我一直在尝试将代码设置
  • stat_smooth 和 geom_ribbon 之间的交互不良

    我正在回答这个问题 https stackoverflow com questions 64574595 geom density returns plot without considering real values 这需要绘制平滑区域
  • 如何在Python中基于if语句保存一个文档?

    我正在尝试根据 if 语句保存文档 我在这里创建单选按钮 info Option 1 Option 2 Option 3 vars for idx i in enumerate info var IntVar value 0 vars ap
  • NoClassDefFoundError:配置属性源

    从昨天开始 在全新安装后 我们的 spring boot 项目在没有更改 Maven 文件 库或其他配置的情况下出现了问题 我们确实尝试将 SpringFrameWork 和 Spring boot 的 pom 版本更新到 1 5 4 Re
  • 整数数组作为字典的键

    我希望拥有使用整数数组作为键的字典 如果整数数组具有相同的值 甚至不同的对象实例 它们将被视为相同的键 我该怎么做呢 以下代码不起作用b是不同的对象实例 int a new int 1 2 3 int b new int 1 2 3 Dic
  • 如何获取所有 Spark 配置以及默认配置?

    我正在开发一个项目 需要收集所有 Spark 配置 问题是 如果没有明确设置参数 我将需要默认值 有没有办法获取所有配置 包括所有默认值 我尝试过 sc getConf getAll 但通过这种方式 我没有得到默认值 SparkListen
  • Java 卡连接到模拟器失败

    我正在尝试测试 Java Card 小程序以建立与 cref 等模拟器的连接 try sckClient new Socket localhost 9025 InputStream is sckClient getInputStream O
  • 如何使用 PHP、CURL 抓取 javascript 网站 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 PHP 应用程序内从另一个站点呈现 javascript https stackoverflow com questions 5332161 how do i render javascrip
  • flutter:地理定位器不起作用,请确保清单中至少定义了 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION

    我正在尝试使用地理定位器 并且我添加了两者
  • Java中的中断线程

    我想优雅地关闭线程 我在网上看到了很多代码并在这里查询 我认为有两种关闭方法 使用布尔标志 只要改变一个标志 我们就可以在 run 方法中破坏代码 使用中断方法 我的问题是 为什么要避免使用布尔标志来正常关闭线程 当我运行示例程序时 它运行
  • 链接静态方法

    这可能没有解决方案 或者我可能找不到解决方案 但这里是 注意 我知道下面的代码是不正确的 我只是想展示我到底是什么想去完成 我想做一些事情 public class ActionBarHandler public static Action
  • Rails - 如何获取访问者的IP地址?

    我需要将访问者的 IP 地址存储到我们的数据库中 这是我尝试执行此操作的方法 ip request remote ip ip request env REMOTE ADDR 但在这两种情况下 ip变量存储值127 0 0 1 即使我将应用程
  • C:对不完整类型的数组添加下标合法吗?

    我在标准中找不到相关位 但 gcc 和 clang 允许这样做 所以我想我想知道它是编译器扩展还是语言的一部分 如果可以的话请提供一个链接 这可能会因以下情况而出现 extern char arr func arr 7 No error 后
  • 作为 IntelliJ 插件的“查找用法”功能

    我试图在 IntelliJ IDEA 中找到一种方法来查找特定项目中一些库方法调用和类的所有用法 目标是编译引用这些特定方法或类的类列表 我该怎么办呢 我可以看到有一个MethodReferencesSearch看起来它可能会有所帮助 但是
  • effective-pom是超级pom和应用程序POM之间的合并

    我尝试使用 mvn help effective pom 命令在示例应用程序上生成有效的 pom http books sonatype com mvnref book reference pom relationships sect po
  • 在打字稿中创建通用的“可克隆”界面

    考虑一个打字稿接口 它描述了对象具有的约束 clone 返回相同类型的对象 或者可能是可分配给其自己类型的对象 的方法 我想象的一个例子 Naive definition interface Cloneable clone gt Clona
  • 将 XML 转换为 XSLT 中的转义文本

    如何使用 XSLT 将以下 XML 转换为转义文本 Source