这是我的第一篇文章,我正在寻求一些帮助,因为我已经尽力而为,但没有运气。
所以,我正在尝试使用一些简单的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 >= 0 AND CONVOCATORIAS_AGOTADAS < 6</condition>
</constraint>
<constraint name="SYS_C0029035">
<type>C</type>
<table-name>ASIGNATURAS_MATRICULADAS</table-name>
<condition>"CONVOCATORIAS_AGOTADAS" IS NOT NULL</condition>
</constraint>
<constraint name="SYS_C0029034">
<type>C</type>
<table-name>ASIGNATURAS_MATRICULADAS</table-name>
<condition>"COD_ASIGNATURA" IS NOT NULL</condition>
</constraint>
<constraint name="SYS_C0029033">
<type>C</type>
<table-name>ASIGNATURAS_MATRICULADAS</table-name>
<condition>"NIF_ALUMNO" IS NOT NULL</condition>
</constraint>
<constraint name="SYS_C0029031">
<type>C</type>
<table-name>ASIGNATURAS</table-name>
<condition>"CODIGO" IS NOT NULL</condition>
</constraint>
<constraint name="SYS_C0029027">
<type>C</type>
<table-name>ALUMNOS</table-name>
<condition>"NIF" IS NOT NULL</condition>
</constraint>
<constraint name="SYS_C0029029">
<type>C</type>
<table-name>ALUMNOS</table-name>
<condition>"PRIMER_APELLIDO" IS NOT NULL</condition>
</constraint>
<constraint name="SYS_C0029028">
<type>C</type>
<table-name>ALUMNOS</table-name>
<condition>"NOMBRE" 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字符数,并且它们是不可见的,因此它使得排序结束。拿走它们会使它按预期工作。
答案 0 :(得分:0)
从Saxon 9.4中的命令行运行时,您的查询会给出预期结果。它也适用于oXygen 13.1(使用Saxon 9.3.0.5)。所以它必须与你运行它的方式有关。也许您以某种方式使查询方案错误,因此您没有使用正确的文件?