重新审视混合字符串值的字母数字排序

2024-04-30

请注意,我之前提出了一个非常相似的问题,但要求已发生变化

对混合字符串值进行字母数字排序 https://stackoverflow.com/questions/3842719/alphanumeric-sort-on-mixed-string-value

现在要求的主要区别在于,源 XML 可以包含 form_name 中全部为字母字符或全部为整数的表单。

form_name 可以是开放季节,因为字母和数字可以按任何顺序排列:

XX ## ##
XX XX ##
XX XX ###
XX XX ## ##
XX ###
XX XXXX
## XXX
XXX###
XXX
###

给定 XML:

<forms>
<FORM lob="BO" form_name="AI OM 10"/>
<FORM lob="BO" form_name="CL BP 03 01"/>
<FORM lob="BO" form_name="AI OM 107"/>
<FORM lob="BO" form_name="CL BP 00 02"/>
<FORM lob="BO" form_name="123 DDE"/>
<FORM lob="BO" form_name="CL BP 00 02"/>
<FORM lob="BO" form_name="AI OM 98"/>
<FORM lob="BO" form_name="543 ZZE"/>
<FORM lob="BO" form_name="543 ABC"/>
<FORM lob="BO" form_name="256"/>
<FORM lob="BO" form_name="ABC"/>
</forms>  

输出应该是:

<forms>
   <FORM lob="BO" form_name="256"/>
   <FORM lob="BO" form_name="123 DDE"/>
   <FORM lob="BO" form_name="543 ABC"/>
   <FORM lob="BO" form_name="543 ZZE"/>
   <FORM lob="BO" form_name="ABC"/>
   <FORM lob="BO" form_name="AI OM 10"/>
   <FORM lob="BO" form_name="AI OM 98"/>
   <FORM lob="BO" form_name="AI OM 107"/>
   <FORM lob="BO" form_name="CL BP 00 02"/>
   <FORM lob="BO" form_name="CL BP 00 02"/>
   <FORM lob="BO" form_name="CL BP 03 01"/>
</forms>

结果应按以下顺序排列:

  1. 仅包含整数的表格
  2. 以整数开头但也包含字母字符(可以包含空格)的形式
  3. 仅包含字母字符的表单
  4. 以字母字符开头但也包含整数(可以包含空格)的形式

因此,类似的表单被分组/排序。我已经尝试对我之前引用的问题中提供的答案进行各种增强,但还没有找到适合该类型的正确过滤模式。 XSLT 2.0 解决方案很好。


此 XSLT 1.0 转换:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:variable name="vAlha" select=
  "' ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
  "/>
 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="/*">
  <forms>
    <xsl:apply-templates select="*[floor(@form_name) = floor(@form_name)]">
      <xsl:sort data-type="number"/>
    </xsl:apply-templates>

    <xsl:apply-templates select=
      "*[substring-before(@form_name,' ')
       and
         translate(substring-before(@form_name,' '),
                   ' 0123456789',
                   '')
        =
         ''
        ]">
      <xsl:sort select="substring-before(@form_name,' ')" data-type="number"/>
      <xsl:sort select="substring-after(@form_name,' ')"/>
    </xsl:apply-templates>

    <xsl:apply-templates select=
    "*[translate(@form_name,$vAlha,'')
      =
      ''
       ]">
       <xsl:sort select="@form_name"/>
    </xsl:apply-templates>

    <xsl:apply-templates select=
    "*[contains($vAlha,substring(@form_name,1,1))
     and
       not(translate(@form_name, $vAlha, '') = '')
       ]">
       <xsl:sort select="translate(@form_name, ' 0123456789', '')"/>
       <xsl:sort select="translate(@form_name, $vAlha, '')" data-type="number"/>
    </xsl:apply-templates>
  </forms>
 </xsl:template>
</xsl:stylesheet>

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

<forms>
    <FORM lob="BO" form_name="AI OM 10"/>
    <FORM lob="BO" form_name="CL BP 03 01"/>
    <FORM lob="BO" form_name="AI OM 107"/>
    <FORM lob="BO" form_name="CL BP 00 02"/>
    <FORM lob="BO" form_name="123 DDE"/>
    <FORM lob="BO" form_name="CL BP 00 02"/>
    <FORM lob="BO" form_name="AI OM 98"/>
    <FORM lob="BO" form_name="543 ZZE"/>
    <FORM lob="BO" form_name="543 ABC"/>
    <FORM lob="BO" form_name="256"/>
    <FORM lob="BO" form_name="ABC"/>
</forms>

产生想要的结果:

<forms>
    <FORM lob="BO" form_name="256"></FORM>
    <FORM lob="BO" form_name="123 DDE"></FORM>
    <FORM lob="BO" form_name="543 ABC"></FORM>
    <FORM lob="BO" form_name="543 ZZE"></FORM>
    <FORM lob="BO" form_name="ABC"></FORM>
    <FORM lob="BO" form_name="AI OM 10"></FORM>
    <FORM lob="BO" form_name="AI OM 98"></FORM>
    <FORM lob="BO" form_name="AI OM 107"></FORM>
    <FORM lob="BO" form_name="CL BP 00 02"></FORM>
    <FORM lob="BO" form_name="CL BP 00 02"></FORM>
    <FORM lob="BO" form_name="CL BP 03 01"></FORM>
</forms>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重新审视混合字符串值的字母数字排序 的相关文章

  • 从 OMElement 对象获取 InputStream/io.Reader

    我有一个OMElement对象 从中我想得到一个InputStream或读者对象 我想要的是流式传输xml来自OMElement我有 没有加载到内存中 我只能得到XMLStreamReader对此表示反对 但我找不到办法得到InputStr
  • 日期减去 xslt 中的另一个日期

    希望有人能帮忙 我正在尝试比较 XML 文件中的 2 个日期并使用 XSLT 进行一些计算 例如 我有 2 个 XML 日期 2011 05 23 和 2011 04 29 我想在 XSLT 中进行计算 如下所示 2011 05 23 20
  • android:widgetLayout 和 android:layout 之间的区别?

    我得到一些奇怪的配置 其中 widgetLayout 配置列表项的内部空间 而布局配置整个项目列表和屏幕背景 有人能真正解释一下什么是 widgetLayout 吗 android layout 整个首选项的布局 包括标题 摘要和小部件 a
  • 哪种 Java DOM 包装器是最好或最受欢迎的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何将 Xml 文件转换为文本文件 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有大约 8000 个 xml 文件需要转换为文本文件 文本文件必须包含 xml 文件的标题 描述和关键字 不含标签 并删除其他元素和
  • C# XML 反序列化。将节点中的所有内部文本读取到字符串属性中

    我目前正在尝试修改我的类 以便我的模型上的文本属性包含某个节点的所有内部文本 text node 给我带来问题的 xml 示例是
  • InstallShield XML 文件更改 - 安装时更改节点属性

    我正在使用 InstallShield 2012 构建 Web 服务安装 并且需要根据用户输入修改应用程序的 Web config 文件 我在 DestinationFolder 对话框之后引入了 PromptServerAndDataba
  • 膨胀类 android.support.design.internal.BottomNavigationView 时出错

    我正在制作我的第一个应用程序 这是一个简单的应用程序 带有启动屏幕和主要活动 现在我有两个构建变体 免费版本 活动底部有 Admob 横幅 付费版本 该应用程序不会在底部显示 admob 横幅 而是将其替换为用于切换活动的底部导航视图 我将
  • 使用父对象引用进行 XML 反序列化

    我有一个描述网站的 XML 文件 它由站点作为根节点组成 可以有页面 页面可以有按钮或文本框和对话框等对象 对话框也可以有对象 在相应的C 类中 全部派生自Element 当我反序列化 XML 时 如何才能引用正在构造的元素的父级 我被告知
  • 在 CollapsingToolbarLayout 中设置 minHeight 没有任何效果

    我目前使用 CollapsingToolbarLayout 遇到的主要问题是 无论我尝试什么 工具栏的 minHeight 属性都没有任何效果 我想要的结果是这样的 CollapsingToolbarLayout 具有一定的展开高度和一定的
  • 使用 JAXB 编组 LocalDate

    我正在构建一系列链接类 我希望能够将其实例编组到 XML 以便我可以将它们保存到文件中并稍后再次读取它们 目前我使用以下代码作为测试用例 import javax xml bind annotation import javax xml b
  • 使用 JAXB 编组只能包含多种子节点类型之一的 XML 节点(SharePoint 查询)

    我正在尝试创建 JAXB 带注释的类来生成基于 Microsoft SharePoint 的 XML查询模式 http msdn microsoft com en us library ms467521 28v office 14 29 a
  • 我想使用对话框显示两个数字选择器

    我试图仅使用 java 在对话框上显示两个数字选择器 代码正在工作 但我无法将其排列为相等的宽度 这是我的代码 RelativeLayout relative new RelativeLayout mContext final Number
  • 如何使用 XSLT 从平面 XML 列表构建树?

    我使用极简 MVC 框架 其中PHP控制器手上的DOM模型 to the XSLT 视图 c f okapi http okapi liip ch 为了构建导航树 我在 MYSQL 中使用了嵌套集 这样 我最终得到一个如下所示的模型 XML
  • & 在 xml 文件中算作一个还是多个字符?

    我正在使用的 XML 模式具有特定的字符串字符长度 所以我可能有一个类似的字符串 Jim Mary 在 C 中是 10 个字符 但是当它写入 xml 时 它会变成 Jim amp Mary 如果 XML 模式规定字符串最多只能有 10 个字
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过
  • 将 XML 映射到 C# 中的类

    我希望使用 XmlSerializer 对象将嵌套元素中的多个 XML 属性映射到单个 POCO 类中 XML
  • 有人可以推荐一个免费的 xslt 工具吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • VBA XML V6.0 如何让它等待页面加载?

    我一直在努力寻找答案 但似乎找不到任何有用的东西 基本上 我是从一个网站上拉取的 当您在该页面上时 该网站会加载更多项目 我希望我的代码在加载完成后提取最终数据 但不知道如何让 XML httprequest 等待 Edited Sub p

随机推荐