使用 XSLT 重新排序 xml 元素

2024-01-18

我有以下 xml 片段,它出现在很多地方,但 TYPE 元素出现的顺序是随机的。此外,不保证所有类型都可用,例如某些片段可能缺少 Visio 和/或 Outlook 或任何其他节点:

<Applications>
    <Type Name="Word">
    <Type Name="Excel">
    <Type Name="PowerPoint">
    <Type Name="Visio">
    <Type Name="Outlook">
</Applications>

我想重新排序 Type 元素,以便如果 Type Excel 存在,它将始终位于列表的顶部,依此类推:

if EXCEL exists, 
place TYPE Excel at the top.
if WORD exists,
place TYPE Word next,
.
.
.

我尝试过使用 xsl:copy、几个 xsl:if,然后应用特定模板,还有 xsl:whens。不幸的是,这些都不适合我。我查看了另一篇关于重新排序 xml 节点元素的文章,这似乎不是我想要的(它使用了 xsl:call-templates,我没有)。

我有一些像下面这样开始的东西,我想我需要将上面的操作代码添加到它的底部:

XML 已更新

<xsl:template match="Applications">
    <xsl:element name="Applications">
        <xsl:element name="Type">
            <xsl:attribute name="Name">PowerPoint</xsl:attribute>
        </xsl:element>
        <xsl:element name="Type">
            <xsl:attribute name="Name">Outlook</xsl:attribute>
        </xsl:element>
        <xsl:apply-templates>
            <xsl:sort select="string-length(substring-before(';Excel;PowerPoint;Outlook;Word;Visio',@Name))"/>
        </xsl:apply-templates>
    </xsl:element>
</xsl:template>

Wanted:

<Applications>
    <Type Name="Excel">
    <Type Name="PowerPoint">
    <Type Name="Outlook">
    <Type Name="Word">
    <Type Name="Visio">
</Applications>

但得到:

<Applications>
    <Type Name="PowerPoint">
    <Type Name="Outlook">
    <Type Name="Excel">
    <Type Name="Word">
    <Type Name="Visio">
</Applications>

感谢帮助让这个东西发挥作用...TIA。


看看<xsl:sort>指令,用作<xsl:apply-templates> or <xsl:for-each>指示。

如果您想要按自然顺序(例如按数字或字母顺序)排序的内容,这相当简单,只需指定<xsl:sort select="@Name">, 例如。

如果您想要自定义排序顺序,有很多选项,但如果您的列表不大,请尝试以下操作:

<xsl:sort select="number-format(string-length(substring-before(
   ';Excel;Word;PowerPoint;Outlook;Visio'
   ,@Name)),'000')" />

这基本上采用了您要查找的字符串之前的字符串部分,并对其长度进行排序,强制三个数字来处理字典排序。Excel解析为001,Word解析为007等

或者,你也可以像这样暴力破解:

<xsl:template match="Application">
  <xsl:copy>
    <xsl:apply-templates select="Type[@Name='Excel']" />
    <xsl:apply-templates select="Type[@name='Word']" />
    <!-- etc.. -->
  </xsl:copy>
</xsl:template>

任何不存在的内容都会被跳过,因为没有任何内容可以应用模板。它更简单,但有点冗长。

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

使用 XSLT 重新排序 xml 元素 的相关文章

随机推荐

  • 正确 Dafny 方法的 Z3 模型

    对于正确的方法 Z3能否找到该方法验证条件的模型 我原以为不会 但这里有一个例子 该方法是正确的 但验证发现了一个模型 这是 Dafny 1 9 7 的情况 Malte 所说的是正确的 我发现它也得到了很好的解释 Dafny 是健全的 因为
  • 图像属性的值 (C#)

    我正在尝试解决更改 Bitmap 对象的 ImageDescription 值的问题 添加文件的描述 搜索了相关主题 没有找到解决方案 My code public Bitmap ImageWithComment Bitmap image
  • 为什么我的 Cassandra 更新不起作用?

    我有以下 Cassandra 表 create table start stop id text start text end text price double PRIMARY KEY id start 我做了这样的插入 insert i
  • 在nodejs中获取url的响应(express/http)

    我试图在nodejs 中获取两个URL 的响应 但是http request 有问题 这是我到目前为止所拥有的 var url https www google com pretend this exists xml var opt hos
  • 样式组件中的CSS' calc() [重复]

    这个问题在这里已经有答案了 尝试这个 const styledDiv styled div props gt props takeViewportHeight min height calc 100vh 16px 它不起作用 我是否遗漏了样
  • 警告:mysql_query(): 3 不是有效的 MySQL-Link 资源

    我遇到了这个奇怪的错误 但我不知道它来自哪里 Warning mysql query 3 is not a valid MySQL Link resource in 3号怎么了 我不明白 有没有人自己经历过这个错误 PHP 使用资源作为特殊
  • 如何在 Android 模拟器中安装 APK 文件?

    我终于成功混淆了我的 Android 应用程序 现在我想通过安装来测试它APK http en wikipedia org wiki APK 28file format 29文件并在模拟器上运行 如何在 Android 模拟器上安装 APK
  • 无法在 macOS High Sierra 上构建和安装 Valgrind

    我无法在 macOS High Sierra 上安装 Valgrind 无法通过brew 我尝试过3 10 https github com msgpack msgpack c issues 525 After make install 我
  • R语言变量冲突

    我有一个 R 脚本 它采用 R 的其他脚本并以这种方式操作它们 并且还执行它们的代码 我的脚本使用一些变量 显然 当其他脚本使用公共变量名时 我会陷入混乱 我希望我可以像在胶囊中一样执行其他脚本 这样重合的变量就不会互相影响 我一直在阅读有
  • 将冷却/计时器添加到 on_message [Discord.py]

    我最近开始用 Python 制作一个 Discord 机器人 用它测试 Python 的基础 并自己创建了一个带有多个命令的功能机器人 为了扩大其用途 我添加了一个级别 XP 系统 到目前为止该系统正在运行 bot event async
  • Nexus 7 上不显示菜单按钮

    所以我很长时间都面临这个问题 我的 Nexus 4 和 Nexus 7 都运行 Android 4 3 并且我有 targetSdkVersion 11 的应用程序 我使用 11 因为任何低于 11 的目标 sdk 都不支持我的多点触控 问
  • IE 7 和 8 中的 CSS 倾斜转换

    我有菱形样式的菜单 它使用以下代码 它在 Chrome firefox ie9 等中运行良好 但我现在需要在 IE 7 和 8 中运行 有没有办法在这些旧版浏览器上执行此操作 http jsfiddle net C7e7U http jsf
  • Django 过滤外键字段

    简洁版本 我有一个用于食谱的 Django 应用程序 并且想要过滤要发送到我的视图中的模板的数据 我基本上希望特定用户添加的所有收据都作为上下文发送 以下过滤返回错误消息以 10 为基数的 int 的文字无效 我的用户名 recipes R
  • jquery旋转图像并将它们保存为同名文件(覆盖)?

    我有一个像这样的简单场景 我想旋转图像 并将它们保存为现有的旧文件 现在 所有功能都已完成 但是当我下载 保存图像时 它总是创建新的文件名 这是我的代码 div img src image a png alt div
  • Opencv 代码慢:有问题吗?

    这是我尝试改善图像颜色的函数 它有效 但真的很慢 也许有人有更好的主意 static Mat correctColor Mat AImage Mat copyImage AImage copyTo copyImage Mat imgLab
  • FileInputStream 和 FileOutputStream 在 Java 中如何工作?

    我正在阅读有关 java 中的所有输入 输出流的信息Java 教程文档 https docs oracle com javase tutorial essential io bytestreams html 教程作者使用这个例子 impor
  • 使用 EPPlus 设置下载位置

    我正在关注This http www c sharpcorner com Blogs 47619 export to excel using epplus aspxEPPlus 上的教程 但我对如何将下载位置设置为登录用户的 下载 文件夹感
  • 获取 ScriptHandlerFactory 处理程序

    有没有办法调用 System Web Script Services ScriptHandlerFactory 类的 GetHandler 方法 该方法返回 IHttpHandler 类型对象 我知道 ScriptHandlerFactor
  • 防止 pip 安装某些依赖项

    我们正在开发一个AWS LambdaPython 中 Alexa 技能的函数并使用pip安装ask sdk打包到我们的dist 目录 pip install t dist ask sdk 问题在于 t dist 因为pip想要在那里拥有所有
  • 使用 XSLT 重新排序 xml 元素

    我有以下 xml 片段 它出现在很多地方 但 TYPE 元素出现的顺序是随机的 此外 不保证所有类型都可用 例如某些片段可能缺少 Visio 和 或 Outlook 或任何其他节点