当前位置: 首页 > 知识库问答 >
问题:

在Oxygen XML Editor上使用Saxon处理器在XQuery中使用order BY时得到错误的顺序

胥玮
2023-03-14

这是我的第一个职位,我正在寻求一些帮助,因为我已经尝试了所有我可以没有任何运气。

因此,我试图使用一些简单的XQuery从XML文件(如下所示)中获取一些数据,但在对结果进行排序时遇到了麻烦,因为它们并不像预期的那样出现。

我的输入文件:

<?xml version="1.0" encoding="UTF-8"?>
<database name="MyDB">
    <constraints>
        <constraint name="ASIGNATURAS_MATRICULADAS_CHK1">
            <type>C</type>
            <table-name>ASIGNATURAS_MATRICULADAS</table-name>
            <condition>CONVOCATORIAS_AGOTADAS &gt;= 0 AND CONVOCATORIAS_AGOTADAS &lt; 6</condition>
        </constraint>
        <constraint name="SYS_C0029035">
            <type>C</type>
            <table-name>ASIGNATURAS_MATRICULADAS</table-name>
            <condition>&quot;CONVOCATORIAS_AGOTADAS&quot; IS NOT NULL</condition>
        </constraint>
        <constraint name="SYS_C0029034">
            <type>C</type>
            <table-name>ASIGNATURAS_MATRICULADAS</table-name>
            <condition>&quot;COD_ASIGNATURA&quot; IS NOT NULL</condition>
        </constraint>
        <constraint name="SYS_C0029033">
            <type>C</type>
            <table-name>ASIGNATURAS_MATRICULADAS</table-name>
            <condition>&quot;NIF_ALUMNO&quot; IS NOT NULL</condition>
        </constraint>
        <constraint name="SYS_C0029031">
            <type>C</type>
            <table-name>ASIGNATURAS</table-name>
            <condition>&quot;CODIGO&quot; IS NOT NULL</condition>
        </constraint>
        <constraint name="SYS_C0029027">
            <type>C</type>
            <table-name>ALUMNOS</table-name>
            <condition>&quot;NIF&quot; IS NOT NULL</condition>
        </constraint>
        <constraint name="SYS_C0029029">
            <type>C</type>
            <table-name>ALUMNOS</table-name>
            <condition>&quot;PRIMER_APELLIDO&quot; IS NOT NULL</condition>
        </constraint>
        <constraint name="SYS_C0029028">
            <type>C</type>
            <table-name>ALUMNOS</table-name>
            <condition>&quot;NOMBRE&quot; IS NOT NULL</condition>
        </constraint>
        <constraint name="ASIGNATURAS_MATRICULADAS_FK1">
            <type>R</type>
            <table-name>ASIGNATURAS_MATRICULADAS</table-name>
            <referenced-constraint-name>ALUMNOS_PK</referenced-constraint-name>
        </constraint>
        <constraint name="ASIGNATURAS_MATRICULADAS_FK2">
            <type>R</type>
            <table-name>ASIGNATURAS_MATRICULADAS</table-name>
            <referenced-constraint-name>ASIGNATURAS_PK</referenced-constraint-name>
        </constraint>
        <constraint name="ALUMNOS_PK">
            <type>P</type>
            <table-name>ALUMNOS</table-name>
            <column-name>NIF</column-name>
        </constraint>
        <constraint name="ASIGNATURAS_PK">
            <type>P</type>
            <table-name>ASIGNATURAS</table-name>
            <column-name>CODIGO</column-name>
        </constraint>
    </constraints>
</database>

我要做的是一个非常简单的事情,获取所有类型为“C”的约束,并显示它们的名称,按字母顺序排序。

这是XQuery:

<check-constraints>
{
for $r in doc("DB.xml")//constraint[type = 'C']/@name
order by $r
return <constraint>{data($r)}</constraint>
}
</check-constraints>
<?xml version="1.0" encoding="UTF-8"?>
<check-constraints>
   <constraint>ASIGNATURAS_MATRICULADAS_CHK1</constraint>
   <constraint>SYS_C0029027</constraint>
   <constraint>SYS_C0029028</constraint>
   <constraint>SYS_C0029029</constraint>
   <constraint>SYS_C0029031</constraint>
   <constraint>SYS_C0029033</constraint>
   <constraint>SYS_C0029034</constraint>
   <constraint>SYS_C0029035</constraint>
</check-constraints>
<?xml version="1.0" encoding="UTF-8"?>
<check-constraints>
   <constraint>SYS_C0029031</constraint>
   <constraint>ASIGNATURAS_MATRICULADAS_CHK1</constraint>
   <constraint>SYS_C0029027</constraint>
   <constraint>SYS_C0029028</constraint>
   <constraint>SYS_C0029029</constraint>
   <constraint>SYS_C0029035</constraint>
   <constraint>SYS_C0029034</constraint>
   <constraint>SYS_C0029033</constraint>
</check-constraints>

我做错了什么?为什么“Order By”没有按应有的顺序排序?如果我不输入“order By”,我会得到与文件中列出的相同顺序的结果,这是有意义的,因为节点是在找到时输入的。

编辑:正如建议的那样,显然这可能是由于XQuery处理器的原因。在本例中,我使用的是Oxygen,它使用Saxon处理器作为默认处理器。我刚试过Zorba在那里很管用。所以现在我更困惑了,哪种输出才是正确的?

解决:我的输入文件包含随机长度数的BOM字符的一些值(错误),他们是不可见的,所以它使排序中断。把他们带走就能像预期的那样工作。

共有1个答案

阎啸
2023-03-14

当在Saxon9.4中从命令行运行时,您的查询会给出预期的结果。在oXygen 13.1(使用Saxon 9.3.0.5)中,它对我也是正确的。所以这肯定和你的运行方式有关。也许您的查询场景搞错了,所以没有使用正确的文件

 类似资料:
  • 我必须使用 XSLT 2.0 处理器来实现字符串操作函数,如 我在 POM 文件中添加了撒克逊的依赖项并运行了“mvn install”命令。通过执行此操作,“saxon-9.1.0.8.jar”被添加到“引用的库”文件夹下。 在代码中,我使用了 当我尝试调用下面一行< code > transformer factory . new instance(" net . SF . Saxon . t

  • 仅产生以下消息: 找不到主类net.sf.saxon.查询 我已经在其他线程中读到这是撒克逊语中 XQuery 模式的正确命令,所以我还能做错什么?

  • 问题内容: 我需要使用python处理XSLT,目前我正在使用仅支持XSLT 1的lxml,现在我需要处理XSLT 2,有没有办法在Python中使用saxon XSLT处理器? 问题答案: 有两种可能的方法: 设置一个接受转换请求的HTTP服务,并通过从Java调用Saxon来实现它们;然后您可以通过HTTP通过Python发送转换请求 使用Saxon / C产品 (当前在预发行版中可用) :此

  • 通过对错误类型实现 Display 和 From,我们能够利用上绝大部分标准库错误处理工具。然而,我们遗漏了一个功能:轻松 Box 我们错误类型的能力。 标准库会自动通过 Form 将任意实现了 Error trait 的类型转换成 trait 对象 Box<Error> 的类型(原文:The std library automatically converts any type that imp

  • 问题内容: 我在Swift中使用,需要获取更好的错误消息。 在调试描述中(例如),我可以看到诸如“给定数据不是有效的JSON”之类的消息,但是我需要知道的是,而不是网络错误(例如)。 我尝试将其强制转换为,但这似乎并未显示更多信息。我当然不需要字符串-甚至错误代码也比这有用得多… 问题答案: 切勿在解码块中打印。这将返回一个毫无意义的通用错误消息。始终打印实例。然后,您会得到所需的信息。 或针对

  • 我正在使用创建简单的STOMP代理。当方法中出现时,我希望收到STOMP帧,但默认情况下它不是这样工作的。 另一方面,在中有一种发送帧的机制,它的代码引用了一些与简单代理相关的类:https://github.com/spring-projects/spring-framework/blob/master/spring-websocket/messaging/springframework/web