1

この作業がやや非正統的であることは承知していますが、誰かが私を助けてくれることを願っています. 製品の XML ファイルに基づいて、XQuery を使用して有効な Latex ファイルを作成しようとしています。XML ファイル (xml/products.xml) は次のようになります。

<?xml version="1.0"?>
<Products>
    <Maker name = "A">
        <PC model = "1001" price = "2114">
            <Speed> 2.66 </Speed>
            <RAM> 1024 </RAM>
            <HardDisk> 250 </HardDisk>
        </PC>

これは私が必要とするラテックス出力です:

\documentclass[]{article}

\begin{document}

\begin{center}
\begin{tabular}{| l | l |}
\hline
Price & Model \\ \hline
price value & model value \\ \hline

\end{tabular}
\end{center}

\end{document}

そして、必要な Latex を生成するために、次の (文字エスケープ) XQuery を作成しました。

let $oc := "&#123;" (: for { :)
let $cc := "&#125;" (: for } :)
let $space := "&#32;" (: space :)
let $tab := "&#9;" (: tab :)
let $ampersand := "&#38;" (: ampersand :)

\\documentclass\[\]{$oc}article{$cc}

\\begin{$oc}document{$cc}

\\begin{$oc}center{$cc}
    \\begin{$oc}tabular{$cc}{$oc}| l | l |{$cc}
    \\hline
    Model{$ampersand}Price{$space}\\\\{$space}\\hline
    {for $pc in doc("xml/products.xml")/Products/Maker/PC
let $price:=data($pc/@price)
let $model:=data($pc/@model)
return
{$model}{$ampersand}{$price} \\\\ \\hline
}
\\end{$oc}tabular{$cc}
\\end{$oc}center{$cc}

\\end{$oc}document{$cc}

クエリを実行できません.. :(. そしていつものように、XQuery は続行するためのデバッグ情報をあまり提供しません.XQuery を使用して文字をエスケープするスマートな方法はありますか?それとも、単にテキストを直接出力するだけでしょうか?

4

2 に答える 2

2

これは考えられる解決策の 1 つです。

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

concat("\documentclass[]{ article }

\documentclass[]{article}

\begin{document}

\begin{center}
\begin{tabular}{| l | l |}
\hline
Price &amp; Model \\ \hline
",
for $pc in doc("xml/products.xml")/Products/Maker/PC
let $price := data($pc/@price)
let $model := data($pc/@model)
return concat($model, " &amp; ", $price, " \\ \hline
"),

"\end{tabular}
\end{center}

\end{document}")

products.xmlLateX 構文に準拠させるために、返されたデータをさらに変更する必要がある場合があることに注意してください。

于 2012-07-09T18:29:55.733 に答える
0

私はクリスチャンのアプローチからコンキャットを少し再構築しました、そして今それはうまくいきます。コードの下:

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

    let $stringa:=string("
    \documentclass[]{article}
    \begin{document}
    \begin{center}
    \begin{tabular}{| l | l |} \hline
    Model &amp; Price \\ \hline
    ")

    return ($stringa),
        (
        for $pc in doc("xml/products.xml")/Products/Maker/PC
        let $price := data($pc/@price)
        let $model := data($pc/@model)

        return concat($model, " &amp; ", $price, " \\ \hline")
        ),
    (
    string("
    \end{tabular} 
    \end{center} 
    \end{document}
    ")
    )
于 2012-07-10T12:22:24.187 に答える