在Oxygen XML Editor上使用Saxon处理器在XQuery中使用ORDER BY时获取错误的顺序

时间:2012-06-04 14:47:18

标签: xml xquery saxon oxygenxml

这是我的第一篇文章,我正在寻求一些帮助,因为我已经尽力而为,但没有运气。

所以,我正在尝试使用一些简单的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 个答案:

答案 0 :(得分:0)

从Saxon 9.4中的命令行运行时,您的查询会给出预期结果。它也适用于oXygen 13.1(使用Saxon 9.3.0.5)。所以它必须与你运行它的方式有关。也许您以某种方式使查询方案错误,因此您没有使用正确的文件?