1

これは私の最初の投稿であり、運がなくてもできる限りのことを試したので、助けを求めています.

そのため、単純な 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>

私は何を間違っていますか?「並べ替え」が正しくソートされないのはなぜですか? 「順序」を付けないと、ファイルにリストされているのと同じ順序で結果が得られます。これは、ノードが見つかったときに入力されるため、意味があります。

編集: 示唆されているように、明らかに XQuery プロセッサが原因である可能性があります。この場合、Saxon プロセッサをデフォルトとして使用する Oxygen に取り組んでいます。Zorba を試してみたところ、そこで動作します。だから今、私はもっと混乱しています。正しい出力はどれですか?

解決済み: 入力ファイルの一部の値に (エラーにより) ランダムな長さの BOM 文字が含まれており、それらが非表示になっているため、順序付けが正しく行われませんでした。それらを取り除くと、期待どおりに機能します。

4

1 に答える 1

0

Saxon 9.4のコマンドラインから実行すると、クエリは期待どおりの結果をもたらします。また、oXygen 13.1(Saxon 9.3.0.5を使用)でも正しく機能します。ですから、それはあなたがそれを実行している方法と関係があるに違いありません。おそらく、クエリシナリオが間違っているため、正しいファイルを使用していませんか?

于 2012-06-04T17:29:45.117 に答える