1

私は次のXMLファイルを持っています:

<layout>
 <layout-structure>
  <layout-root id="layout-root">
    <layout-chunk id="header-text">
         <layout-leaf xref="lay-1.01"/>
         <layout-leaf xref="lay-1.02"/>
    </layout-chunk>
    <layout-leaf xref="lay-1.03"/>
  </layout-root>
  <layout-root id="layout-root-two">
    <layout-chunk id="header-text-two">
     <layout-leaf xref="lay-1.04"/>
     <layout-leaf xref="lay-1.05"/>
     <layout-leaf xref="lay-1.06"/>
    </layout-chunk>
  <layout-leaf xref="lay-1.07"/>
 </layout-root>
</layout-structure>

<realization>
  <text xref="lay-1.01 lay-1.04"/>
  <text xref="lay-1.02 lay-1.05"/>
  <graphics xref="lay-1.03 lay-1.06" type="1"/>
  <graphics xref="lay-1.07" type="2"/>
</realization>
</layout>

以下に示す関数のfor句の出力を制限するために、グラフィック要素の外部参照属性の値を抽出したいと思います。

declare function local:gfx($root, $graphics) {
let $graphic-xrefs := tokenize($graphics/@xref, " ")
for $layout-leafs in $root//layout-leaf[@xref = $graphic-xrefs]
return concat('"', $layout-leafs/@xref, '" ', $dotgraphics, ';', $newline) 
};

ただし、の場合のように、 graphics要素の下の一部の外部参照属性に単一の値が含まれているため、これによりエラーが発生します。<graphics xref="lay-1.07"/>

トークン化を使用してグラフィックス/外部参照値をフェッチすることは可能ですか、それとも別のアプローチを使用する必要がありますか?

4

2 に答える 2

1

作成方法を変更してみてください$graphic-xrefs...

declare function local:gfx($root, $graphics) {
    let $graphic-xrefs := 
        for $xref in $graphics/@xref
        return
            tokenize($xref,' ')
    for $layout-leafs in $root//layout-leaf[@xref = $graphic-xrefs]
    return concat('"', $layout-leafs/@xref, '" ', $dotgraphics, ';', $newline) 
};
于 2012-09-06T02:32:18.917 に答える
0

tokenize分割された文字列が検索文字列内にない場合、は単に文字列全体を返すため、これによって問題が発生することはありません。

このような一般的な処理には、通常のif (...) then ... else ...ステートメントが役立つ場合があります。さらに、try { ... } catch {...}コンストラクトを使用して予期しない状態を処理することもできます。

これを実行すると、コードは実際に期待どおりに機能します。

declare variable $t :=
<layout>
 <layout-structure>
  <layout-root id="layout-root">
    <layout-chunk id="header-text">
         <layout-leaf xref="lay-1.01"/>
         <layout-leaf xref="lay-1.02"/>
    </layout-chunk>
    <layout-leaf xref="lay-1.03"/>
  </layout-root>
  <layout-root id="layout-root-two">
    <layout-chunk id="header-text-two">
     <layout-leaf xref="lay-1.04"/>
     <layout-leaf xref="lay-1.05"/>
     <layout-leaf xref="lay-1.06"/>
    </layout-chunk>
  <layout-leaf xref="lay-1.07"/>
 </layout-root>
</layout-structure>

<realization>
  <text xref="lay-1.01 lay-1.04"/>
  <text xref="lay-1.02 lay-1.05"/>
  <graphics xref="lay-1.03 lay-1.06" type="1"/>
  <graphics xref="lay-1.07" type="2"/>
</realization>
</layout>;

declare function local:gfx($root, $graphics) {
let $graphic-xrefs := tokenize($graphics/@xref, " ")
for $layout-leafs in $root//layout-leaf[@xref = $graphic-xrefs]
return $layout-leafs/@xref
};

local:gfx($t, $t/realization/graphics[2])

<layout>コードスニペットの最後は、実際には終了ステートメントである必要があることに注意してください。

于 2012-09-04T14:24:48.660 に答える