3

私は、一見単純に見える XQuery の演習に行き詰まっています。XML ファイルの一部の下。

<Ships>
<Class name = "Kongo" type = "bc" country = "Japan" numGuns = "8" 
        bore = "14" displacement = "32000">
    <Ship name = "Kongo" launched = "1913" />
    <Ship name = "Hiei" launched = "1914" />
    <Ship name = "Kirishima" launched = "1915">
        <Battle outcome = "sunk">Guadalcanal</Battle>
    </Ship>
    <Ship name = "Haruna" launched = "1915" />
</Class>
</Ships>

クラス名属性 (Kongo) をヘッダーとして使用し、子船の名前と打ち上げ年の列挙リストを使用して、XML を XHTML に変換しようとしています。

<h1>Kongo</h1>
<table>
<tr><th>Name</th><th>Launched</th><tr>
<tr><td>Kongo</td><td>1913</td></tr>
<tr><td>Hiei</td><td>1914</td></tr>
<tr><td>Kirishima</td><td>1915</td></tr>
<tr><td>Haruna</td><td>1915</td></tr>

<h1>Next Class name</h1>
....

次のネストされた return-FLOWR XQuery に行き詰まっています。

declare option output "method=xml";
declare option output "doctype-public=-//W3C//DTD XHTML 1.0 Strict//EN";
declare option output "doctype-system=http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";
declare option output "omit-xml-declaration=no";
declare option output "indent=yes";

<html xml:lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>XQ-7</title>
  </head>
  <body>
       {for $class in doc("xml/battleships.xml")/Ships/Class 
    let $cname := data($class/@name) 
    let $sname := data($class/Ship/@name)
    let $slaunched := data($class/Ship/@launched)
      return   
      <h1>{$cname}</h1>
      <table>
      {for $ship in doc("xmlbattleships.xml")/Ships/Class/Ship
      where data($ship/../@name) eq $cname
        let $sname := data($ship/@name)
        let $slaunched := data($ship/@launched)
        return
         <tr><td>{$sname}</td><td>{$slaunched}</td></tr>
  }
</table>
    }
   </body>
</html>
4

2 に答える 2

5

あなたが立ち往生している問題は、要素と要素の両方を返したいときに、単一の要素またはシーケンスが必要であることだと思い<h1>ます<table>。ここでシーケンスを使用します。

return
(
    <h1>{$cname}</h1>,
    <table>
    [snip]
)

見出しタグの後の括弧とコロンの両方に注意してください。あなたのwhere句には別の問題があり、それを述語に移動しました。

目的の出力は有効な XHTML ではありません: ヘッダーの前にテーブルを閉じる必要があります。また、列挙の代わりにテーブルを取得します。正確に何を探していますか?

このクリーンアップおよび修正されたコードは私にとっては機能します。ドキュメントといくつかの宣言を削除しましたが、変更を見つけることができます。

<html xml:lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>XQ-7</title>
    </head>
    <body>
        {
            for $class in /Ships/Class 
            let $cname := data($class/@name) 
            let $sname := data($class/Ship/@name)
            let $slaunched := data($class/Ship/@launched)
            return
                (
                    <h1>{$cname}</h1>,
                    <table>
                    {
                        for $ship in /Ships/Class/Ship[@name = $cname]
                        let $sname := data($ship/@name)
                        let $slaunched := data($ship/@launched)
                        return
                        <tr>
                            <td>{$sname}</td>
                            <td>{$slaunched}</td>
                        </tr>
                    }
                    </table>
                )
        }
   </body>
</html>
于 2012-07-09T23:35:02.663 に答える
2

このビットは、他の場所で行われた調整と微調整により、最終的にうまくいきました。Xquery、きっと気に入っていただけるはずです ;):P.

    declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
    declare option output:method "xml";

    <html xml:lang="en">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
            <title>XQ-7</title>
        </head>
        <body>
            {
                for $class in doc("xml/battleships.xml")/Ships/Class 
                let $cname := data($class/@name) 
                let $sname := data($class/Ship/@name)
                let $slaunched := data($class/Ship/@launched)
                return
                    (
                        <h1>{$cname}</h1>,
                        <table>
                        <tr><th>Name</th><th>Launched</th></tr>
                        {
                            for $ship in doc("xml/battleships.xml")/Ships/Class/Ship[../@name = $cname]
                            let $sname := data($ship/@name)
                            let $slaunched := data($ship/@launched)
                            return
                            <tr>    
                                <td>{$sname}</td>
                                <td>{$slaunched}</td>
                            </tr>
                        }
                        </table>
                    )
            }
       </body>
    </html>
于 2012-07-10T07:59:42.357 に答える