源中包含 < 和 > 的 XSLT 转换

2023-12-02

我有一个以下格式的输入 XML:

<Plugins>
   <AssemblyName>msoft, Version=5.0, Culture=neutral, PublicKeyToken=null</AssemblyName>
   <TypeName>BT</TypeName>
   <Version>?</Version>
   <Configuration>&lt;AppData xmlns="http://tempuri.org/AppData.xsd"&gt;
      &lt;Readers&gt;
        &lt;Id&gt;1234&lt;/Id&gt;
        &lt;Port&gt;6500&lt;/Port&gt;
        &lt;Type&gt;M200&lt;/Type&gt;
        &lt;Active&gt;Yes&lt;/Active&gt;
      &lt;/Readers&gt;
      &lt;Readers&gt;
        ...
   </Configuration>
   ...
</Plugins>

我想将其转换为另一种 XML,如下所示,

<Plugins>
   <MyReaders>
       <DeviceId>1234</DeviceId>
       <PortNum>6500</PortNum>
       <ModelType>M200</ModelType>
       <Active>Yes</Active>
   </MyReaders>
</Plugins>

我想使用 XSLT 进行转换。我怎样才能做到这一点?


我将使用您提供的示例,并假设它格式良好。为此,我在源代码中添加了四行,现在是:

<Plugins>
    <AssemblyName>msoft, Version=5.0, Culture=neutral, PublicKeyToken=null</AssemblyName>
    <TypeName>BT</TypeName>
    <Version>?</Version>
    <Configuration>
        &lt;AppData xmlns="http://tempuri.org/AppData.xsd"&gt;
          &lt;Readers&gt;
            &lt;Id&gt;1234&lt;/Id&gt;
            &lt;Port&gt;6500&lt;/Port&gt;
            &lt;Type&gt;M200&lt;/Type&gt;
            &lt;Active&gt;Yes&lt;/Active&gt;
          &lt;/Readers&gt;
          &lt;Readers&gt;
          &lt;/Readers&gt;
        &lt;/AppData&gt;
    </Configuration>
</Plugins>

您将需要 XSLT 2.0 处理器或 XSLT 1.0 扩展。这是使用 XSLT 2.0 的解决方案:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:tempuri="http://tempuri.org/AppData.xsd"
    exclude-result-prefixes="tempuri"
    version="2.0">

    <xsl:output method="xml" indent="yes" use-character-maps="angle-brackets"/>
    <xsl:character-map name="angle-brackets">
        <xsl:output-character character="&lt;" string="&lt;"/>
        <xsl:output-character character="&gt;" string="&gt;"/>
    </xsl:character-map>

    <xsl:strip-space elements="*"/>

    <xsl:template match="Plugins">
        <xsl:copy>
            <xsl:apply-templates select="Configuration"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Configuration">
        <xsl:variable name="input">
            <xsl:value-of select="."/>
        </xsl:variable>
        <xsl:apply-templates select="document(concat('data:text/xml,',$input))/tempuri:AppData/tempuri:Readers" />
    </xsl:template>

    <xsl:template match="tempuri:Readers">
            <MyReaders>
                <DeviceId><xsl:value-of select="tempuri:Id"/></DeviceId>
                <PortNum><xsl:value-of select="tempuri:Port"/></PortNum>
                <ModelType><xsl:value-of select="tempuri:Type"/></ModelType>
                <Active><xsl:value-of select="tempuri:Active"/></Active>
            </MyReaders>
    </xsl:template>
</xsl:stylesheet>

它实际上会处理您的数据两次。内容内的尖括号Configuration使用转换character-map。结果被放置在变量中$input使用以下方法将其转换为节点document()功能。

由于您的数据位于命名空间中,因此有必要在 XPath 表达式前面加上它的前缀。使用以下命令从结果中删除名称空间声明exclude-result-prefixes="tempuri".

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

源中包含 < 和 > 的 XSLT 转换 的相关文章

随机推荐

  • 您可以在 makefile 中执行 $(wildcard %/**/*.c) 吗?

    作为后续这个问题 还有一个情况我在几个小时的修修补补中还没有弄清楚 这是 makefile 当前的样子 output shell find lib type f name build js or name build css myth no
  • Bare-Except 不受欢迎的任何原因

    在某种程度上 我想知道为什么在 Python 中使用裸异常会如此令人不悦 如果我有一个完整的程序正在运行并且我做了类似的事情 我就会明白 import sys from application import program try prog
  • 如何在 CSS3 中为元素设置摆动动画?

    自从我看到国库网站还有树上摆动的标志效果 我一直在尝试重现 box width 50px height 50px background blue box shadow 0 0 5px blue margin 100px float left
  • 无法在 AVAudioplayer 中实施前向操作

    我正在使用 AVAudioplayer 播放一些音频文件 我有一些控件 例如前进和后退 倒带工作正常 但前进则不然 void rewind AVAudioPlayer player rewTimer userInfo player curr
  • 使用 python sdk 在 azure 中的 Linux 虚拟机中运行命令

    我发现azure python sdk提供了以下在linux虚拟机中运行命令的方法 from azure mgmt compute import compute management client from azure common cre
  • Android:使用默认音乐播放器播放歌曲文件

    有没有办法使用默认媒体播放器播放媒体 我可以使用以下代码来做到这一点 Intent intent new Intent Intent ACTION VIEW MimeTypeMap mime MimeTypeMap getSingleton
  • char 和 unsigned char 有什么区别?

    已编辑将 C C 更改为 C 请帮我找到一个明确的澄清char and unsigned char特别是当我们在嵌入式设备和普通PC之间传输数据时 缓冲区和普通PC之间的区别 unsigned char和朴素的char 您问的是两种不同的语
  • linux下Java RandomAccessFile.java无法正常工作

    我试图在java中实现简单的tail f linux命令 这是我的代码 try position within the file File file new File home curuk monitored log txt RandomA
  • 如何使用 django-simple-history 存储 ManyToManyField 的历史记录。

    如何使用 django simple history 存储 ManyToManyField 的历史记录 我使用带有属性 m2m filds 的 HistoricalRecords 但它抛出错误 意外的关键字参数 m2m fields 我是
  • 增强 ggvis 轴

    我正在寻找增强图表的最佳方法 library dplyr library ggvis df lt data frame Year c 1954 2013 Count rep as integer c 1 3 4 2 15 df gt ggv
  • 使用 AppleScript 将 .rtf 文本复制到电子邮件正文中

    我有一个 AppleScript 应用程序 它可以创建一封电子邮件 在 Mail app 中 其中包含我通过对话框选择的选项中的附件 文本模板存储在 rtf格式 以便非程序员可以根据自己的意愿更改文本模板 我可以从以下地址创建电子邮件 tx
  • C++ 中并行向量的 find_first

    我有一个相当大的向量 一些向量成员并行地匹配某个条件 我想找到与条件匹配的第一个元素 我的问题与这个问题非常相似 tbb 并行查找第一个元素 但我没有tbb 检查条件非常繁琐 所以我无法依次对所有条件进行检查 这就是为什么我想并行运行它 我
  • php - 如何合并每个数组具有不同元素数的二维数组

    我有 2 组二维数组 我想合并成 1 个二维数组 但每个数组中的元素数量不相同 并且前 2 个元素相同 我不想重复它 这是它 第一个二维数组 Array 0 gt Array 0 gt 25 2 2013 1 gt 8 45 a m 2 g
  • Model View ViewModel / Knockout 解决什么问题? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我在阅读某人的代码时遇到了 Knockout 和 MVVM 我对这两个主题都做了一些阅读 但我仍然对它们真正解决的问题感到困惑 很可能是因为我还没有构建足够大的应用程序来解决这个
  • 导入错误:没有名为 pandas 的模块

    我正在尝试用 Python 编写代码来获取 Twitter 数据 但没有收到 twython 错误 但我遇到了 Pandas 错误 我已经使用安装了 Pandaspip install pandas 但我仍然收到以下错误 我该如何修复它 F
  • ANTLR4 解析树简化

    有没有办法让 ANTLR4 自动删除生成的解析树中的冗余节点 更具体地说 我一直在尝试 GLSL 的语法 由于自动处理运算符优先级所需的规则转发 您最终会在解析树中得到长线性 表达式 序列 大多数生成的树节点只是 转发到下一个优先级 因此不
  • 如何更改图例的顺序

    我想改变图例的顺序 见图 我希望序列是 绿色和data2 蓝色和data3 黑色和data4 红色和data1 有人能给个demo吗 更改将图添加到图中的顺序 然后调用legend通常情况下 应该可以做到这一点 您也可以按如下方式进行 首先
  • 上传带有 Angular 材质和 Angular JS 的文件

    对于代码 我从中得到了灵感 https codepen io alexandergaziev pen JdVQQm 所以 对于 HTML 我这样做了 div class file input div div class file input
  • 使用C在eclipse中多重定义主要错误

    我正在尝试使用 Eclipse 中的 C 项目生成两个 exe 客户端和服务器 两者都有主要功能 因为他们是不同的前任 两者都使用通用的 confutils c 文件 如何解决主要问题的多重定义 我知道我们不能在一个项目中有两个电源 我的
  • 源中包含 < 和 > 的 XSLT 转换

    我有一个以下格式的输入 XML