XPath関数メモ fn:string()

hoge.xml

<course>
  <master><last>中林</last><first>太郎</first></master>
  <master><last></last><first>林太郎</first></master>
</course>

hoge.xq

for $master in fn:doc("hoge.xml")/course/master
return
    <result>
      <master>{ fn:string($master) }</master>
    </result>

結果XMLデータ

<result>
  <master>中林太郎</master>
</result>
<result>
  <master>中林太郎</master>
</result>

で、教科書読み進めてみたら、こんな解決策が!

      <master>{ $master/last/text() } { $master/first/text() }</master>

……。まあいいです……ここではfn:string()の動きが知りたかっただけなので。

ちなみに、

      <master>{ $master/last } { $master/first }</master>

これは、要素がそのまま出力されて、

<result>
  <master><last>中林</last><first>太郎</first></master>
</result>
<result>
  <master><last></last><first>林太郎</first></master>
</result>

こうなります。あと、text()使わずに、fn:string()とかね。やらないけどね。

      <master>{ fn:string($master/last) } { fn:string($master/first) }</master>

あ、属性のときはやるか。

piyo.xml

<course>
  <master last="中林" first="太郎"/>
  <master last="中" first="林太郎"/>
</course>

piyo.xq

for $master in fn:doc("piyo.xml")/course/master
return
    <result>
      <master>{ fn:string($master/@last) } { fn:string($master/@first) }</master>
    </result>