月別アーカイブ: 2020年9月

XSLT 3.0(XPath 3.1)JSONをXMLに変換せずに利用する

先週はXMLの形にしたJSONを、XMLにしないまま扱う方法について紹介します。CSLはでてきません。

XPath 3.1*1で名前にJSONが入る関数は4つです。

  • fn:parse-json($json-text as xs:string?, $options as map(*))
  • fn:json-doc($href as xs:string?, $options as map(*))
  • fn:json-to-xml($json-text as xs:string?, $options as map(*))
  • fn:xml-to-json($input as node()?, $options as map(*))

$optionsについては説明しません。JSONをテキストとして引数にとるのがfn:parse-json()fn:json-to-xml()
fn:json-doc()は外部JSONファイルを読み込むときなどに指定します。fn:unparsed-text()で取得したテキストをfn:parse-json()へ適用するのと
大体同じことを行います。今回取り上げるのはfn:parse-json()fn:json-doc()についてです。

mapとarray

関係する名前空間は次に挙げるものです。

  • fn=”http://www.w3.org/2005/xpath-functions”
  • map=”http://www.w3.org/2005/xpath-functions/map”
  • array=”http://www.w3.org/2005/xpath-functions/array”

XPath 3.1のmap構造とarray構造は一般的なプログラミング言語におけるそれとほぼ同じもので、JSONオブジェクトをそのままの形で格納できます。
先週登場したJSONを見てみましょう。

{
    "items": [
        {
            "id": "7646893/2E3MJB9A",
            "type": "book",
            "title": "スタイルシート開発の基礎",
            "publisher": "アンテナハウス株式会社",
            "publisher-place": "Tokyo",
            "event-place": "Tokyo",
            "ISBN": "978-4-900552-23-4",
            "language": "ja",
            "author": [
                {
                    "family": "アンテナハウス株式会社",
                    "given": ""
                }
            ],
            "issued": {
                "date-parts": [
                    [
                        2016,
                        5
                    ]
                ]
            }
        }
    ]
}

このJSONを外部ファイルとして取り込むには次のように記述します。

<xsl:param name="input" >'exported-data.json'</xsl:param>
...
<xsl:variable as="map(*)" name="jsonMap" select="fn:json-doc($input)"/>
<!-- または -->
<xsl:variable as="xs:string" name="json-text" select="fn:unparsed-text($input)"/>
<xsl:variable as="map(*)" name="jsonMap" select="parse-json($json-text)"/>

XMLに変換した先週と、mapやarrayを活用する今回はこの後がまったく異なります。

次の記述で、先頭のtitleを一息で取得します。

<xsl:value-of select="map:get(array:head(map:get($jsonMap, 'items')), 'title')" />

まず、最も外側のmapから、itemsのキーを持つ要素を取得します(map:get($jsonMap, 'items'))。
キーitemsの値はarray型です。このままmap:get()を行おうとしてもできませんから、arrayの先頭を取り出すarray:head()を使用しています。ところで上の記述はパイプ演算子を使えば次のように書けます。

<xsl:value-of select="map:get($jsonMap, 'items') => array:head() => map:get('title')" />

mapのarrayでは、map:find()を利用することで指定したキーの値を配列で得ることもできます。挙動の詳細はXPath 3.1*1かXSLT 3.0*2のページを確認してください。

typeの値が何種類かに決まっていて、その種類を元にif文の判定をしたいのであれば、次のように書けます。

     <xsl:variable as="map(*)" name="item" select="map:get($jsonMap, 'items') => array:head()" />
      <xsl:if test="map:get($item,  'type') =  'book' or 'proceedings'">
      <xsl:value-of select="map:get($item, 'type')" /> <!-- book -->
      </xsl:if>

もちろんXMLの構造に変換しても同じことはできますが、より一般的なプログラミング言語に近い形で扱えています。

mapやarrayとして扱うために、JSONテキストとして記述してパースしたり、select="map{"key":value}"のような書き方をする以外に、<xsl:map><map-entry>を使うことができます。

mapの操作はエントリの追加やキー指定での削除などの他、map:merge()によるmapの統合、map:for-each()によるmap要素単位での関数適用などが可能です。arrayの方はarray:fold-left()array:fold-right()の畳み込み関数や、array:for-each()でarrayの要素ごとに関数適用などなど、XML形式を扱うよりもすっきりした構文で記述が可能な関数が用意されています。

注意しなければならないこととして、mapであるかarrayであるかを間違えるとうまく値を取り出せません。$itemnodeでもないので、直接xml-to-json()は使えません。

仕様やSaxonのドキュメントとにらめっこをしながら紹介してきたXSLT 3.0とXPath 3.1のJSONの扱いですが、誤りなどありましたらご指摘ください。

*1 https://www.w3.org/TR/xpath-31/
*2 https://www.w3.org/TR/xslt-30/


参考資料



e-na伊那谷 旅便り 第36回 川下り米

お盆が過ぎても連日の猛暑ですが、朝晩はずいぶんと涼しくなってきました.田んぼの稲も8月の初めに出穂(しゅっすい)して今は刈取り前の重い穂をつけています.今回は伊那の川下り米について紹介します.

川下り米とは

川下り米とは長野県伊那市の三峰川水系でとれるお米を指します.三峰川は南アルプスジオパークと呼ばれる広大な南アルプスを源にして、伊那市長谷村を高遠町に向かって南から北に流れ、そののち伊那市の市役所の南側で天竜川と合流します.
南アルプスを源流としているため、その水は山の多様な岩石から出たミネラル分を多く保有し、その水を吸って育ったお米はいわゆる「食味」が高く美味しいとされています.
えっ?日本にはいろいろなブランド米があるのにそれよりおいしいの?と思われる方がいるかもしれません.
実は信州大学農学部の井上直人教授が2008年に伊那市各地の米の成分分析を行いました.その結果、新潟県魚沼などの日本各地のブランド米と同等かそれ以上にマグネシウムや鉄分、銅、亜鉛などといったミネラル成分を含み食味に影響していることを報告しています.この一部は、「おいしい穀物の科学~コメ、ムギ、トウモロコシからソバ、雑穀まで」(井上直人著 講談社 ブルーバックス 2014年)に掲載されています.


私たち伊那市の住人は普段何も気にせず地元のお米を食べています.昔他県に行っていた学生時代に家から仕送りで送られてきた川下り米を、そちらの知人にお譲りしたことがありました.あとからその知人に「子供たちが『このご飯はおいしい』とおかずなしで何杯も食べて驚いた.なぜあんなにおいしいの?」と聞かれて返答に窮したことがあります.それほどまでに川下り米はおいしいのですね.

伝兵衛井筋

さて三峰川水系の水といっても、盆地の真ん中の低いところを流れる川の水は直接水田にとりいれられるわけではありません。私の住んでいる伊那市の東春近は、三峰川の南、天竜川に対しては河岸段丘の上なので、川は見下ろす位置にあります。ではどのように水田の水を得ているかと言いますと、今から360年も前から幾多の苦労を経て作られた伝兵衛井筋という三峰川の上流から取水する用水路でこの地域全体の水田に入れる水がまかなわれています。
http://www.nag-doren.or.jp/wp/wp-content/themes/world/images/sosui/kamiina/pdf09.pdf

穂が出る今の時期は、水路の水は奪い合いです.特に私の家の田んぼは取水口が離れているため、上流で取水して水量が減るとまったく水が入ってくれません.このため、水量が戻る夜間にしか水を入れることができません.また平地と違って、盆地の方向の北から南へ、河岸段丘の東から西へと、田んぼは段差があります.下手をすると隣の田んぼと高さが1m以上もある場合があります.こういう土手はモグラの恰好の住処となり、そこらに穴を掘られて漏水してしまいます.夜中に懐中電灯とスコップを持って穴をふさぎに行かねばなりません.お米作りもなかなか大変です.

消費者と結ぶ

農家が加入するJA上伊那では、生活クラブ生協との間で、私の伊那市東春近地域、伊那市の南に位置する宮田村の水田を対象としてお米を契約栽培しています.今は新型コロナの流行で中止されていますが、毎年生活クラブ生協の組合員の方が子供連れで地元に来ていただき、水田での生き物調査や食事会、経験交流などを行ってきました.生活クラブ生協に出荷するためには、水田で年間に使用する農薬の成分数を8以下にすることが厳しく求められており、契約栽培の水田には以下のような看板を立てることになっています.

この契約米は、生活クラブ生協で「上伊那アルプス米」として組合員の方々に提供していただいています.
https://seikatsuclub.coop/item/rice/669890.html
※ 9成分とありますが、近年は8成分に制限されています.

さてこのような伊那の川下り米、「伊那華の米(いなかのこめ)」としてJAからご購入いただけます.是非一度味わってみてください.

https://www.ja-town.com/shop/g/g3801-114014/


電帳法スキャナ保存の「禁じ手」ついて YouTubeミニセミナー第14弾

デジタル化に舵を切る為の最短コースである国税庁の「電子帳簿保存法」「スキャナ保存」、その「禁じ手」と「リスク」への考察をします。

電子帳簿保存法4条3項で規定されている「スキャナ保存」制度の保存要件は同法施行規則3条に細かく規定されていて、その要件を同法通達*1や通達趣旨説明並びに一問一答*2で補完されています。

今回のテーマは「「業務の処理に係る通常の期間」を経過した紙書類を定期検査後廃棄する行為」です。

内容をギュッと8分に圧縮して、YouTubeでいつでも視聴できるミニセミナーにしました。
お好みのところのみ短時間での確認も可能です!!

皆様のお役に立てれば幸いです。
また、要望を頂ければ、その要望にマッチした、セミナーの制作を検討させていただきます。

  1. *1  電子帳簿保存法取扱通達の制定について|国税庁 https://www.nta.go.jp/law/tsutatsu/kobetsu/sonota/980528-4/index.htm
  2. *2 電子帳簿保存法Q&A(一問一答)|国税庁  https://www.nta.go.jp/law/joho-zeikaishaku/sonota/jirei/07index.htm

【 公開セミナー 一覧 】

  1. 第1回 「日本はデジタル化後進国か?!」
    https://youtu.be/aKctKhLRjOY
  2. 第2回 「電帳法」を優しく解説
    https://youtu.be/RbEZe00m0TA
  3. 第3回 「帳簿・書類」の7年保存がそもそも何故求められるのか?
    https://youtu.be/Ht68XGdFdnU
  4. 第4回 タイムスタンプって_なに?
    https://youtu.be/RqRbwlHvAfo
  5. 第5回 国税庁の「電子帳簿保存法」のページの見方
    https://youtu.be/pCUfL17KgEY
  6. 第6回 電帳法4制度の横断的概要学習!
    https://youtu.be/5HbsneGZAFQ
  7. 第7回 電帳法_電子取引の最新情報!
    https://youtu.be/cRT4Cw4-n70
  8. 第8回 電帳法_導入手順!
    https://youtu.be/a7lRuEusH1Q
  9. 第9回 電帳法対応のシステム・サービスのご説明
    https://youtu.be/742w23Xd4RQ
  10. 第10回 「ScanSave」のデモムービーシリーズ 基礎編_「多彩な入力機能」
    https://youtu.be/RCN1lXSU94Y
  11. 第11回 「ScanSave」のデモムービーシリーズ _「多彩な入力機能」_応用編
    https://youtu.be/3jXpPZVM4Ko
  12. 第12回 「ScanSave」のデモムービーシリーズ _まとめてタイムスタンプ
    https://youtu.be/klXAns3Mgc4
  13. 第13回 「ScanSave」のデモムービーシリーズ _エキスポート機能について
    https://youtu.be/MhREvX_kRBU

筆者紹介
益田康夫
メールアドレス:masuda@antenna.co.jp
1984年に社会人になり、IT業界一筋ながら3回の転職を経て現在に至っています。
特に2008年のリーマンショック後の不況の影響を受けて、2010年6月末にリストラ退社して現本業のアンテナハウス株式会社 https://www.antenna.co.jp/ に入社しました。Sun MicrosystemsやOracleを中心にしたITインフラから、IAサーバとしてのCompaqやIBMなどや、文書管理システムやポータルシステムを販売していた前職と、現在のアンテナハウスでのPDF技術や電子ファイルの変換技術などを中心にした、e-ドキュメントソリューションを探求してノウハウを習得してきました。特に、2011年以降、個人で学習時間をひねり出して、文書情報管理士資格2級、1級、上級と最短記録でレベルアップさせ、更に国家資格の行政書士※、日商簿記3級を2015年までに取得しました。
※行政書士とは、https://www.gyosei.or.jp/information/ をご覧ください。


Citation Style Languageの話(2) – 引用データJSONのXML化

前回引用データとスタイルの分離の必要性については述べていたので、CSL自体の歴史を見てみました。

Citation Style Languageの歴史について、
CSLのページ*1によれば、Bruce D’Arcus氏を中心に開発され、初期はZoteroのSimon Kornblith氏
がコントリビュートしていました。近年は Frank G. Bennett, Jr. と Rintze M. Zelleによって開発が主導されています。リンクが張られている2010年9月の外部記事はすでに読めなくなっていて、Blogは1.0のニュースリリース*2からです。

Wikipediaの記事*3にはその前身はBiblioXという取り組みであると記載されているのですが、2020年8月31日現在BiblioXのページは消失しており、辿ることが少し難しいようです。BiblioXの発表は2004年ですので、合わせれば15年以上の歩みとなります。

脱線しますが、URLが失効しあるものの歴史を辿るのが難しいというのは堪えます。Web Archiveなどのプロジェクトにしても、無限、無制限というわけにはいきません。それでも、参照した情報元が分かるよう引用情報を記述することの大事さを噛みしめています。

引用データのJSONをXSLTでXML化する

さて、CSLの引用データを確認してみましょう。Zoteroの出力一覧に「Citation Style Language …」という文字列が見えます。ポチッとな……無事ダウンロードされました。

「export-data.json」が。


{
    "items": [
        {
            "id": "7646893/2E3MJB9A",
            "type": "book",
            "title": "スタイルシート開発の基礎",
            "publisher": "アンテナハウス株式会社",
            "publisher-place": "Tokyo",
            "event-place": "Tokyo",
            "ISBN": "978-4-900552-23-4",
            "language": "ja",
            "author": [
                {
                    "family": "アンテナハウス株式会社",
                    "given": ""
                }
            ],
            "issued": {
                "date-parts": [
                    [
                        2016,
                        5
                    ]
                ]
            }
        }
    ]
}

引用データそのものは文書レイアウトのような複雑な構造を持ちませんし、XML形式である必要はないですからね。とはいえXSLTでこのデータを扱うにはどこかの段階でXMLに変換する必要があります。幸いなことに2020年のXSLTはJSONだって簡単に扱えます。今回はJSONがXSLT3.0で扱えることを示します。

XSLT 3.0 (というよりXPath 3.1)ではmap、arrayという頼もしい機能が用意されていますが、今回は構造に登場するだけです。次のテンプレートでは、外部ファイルであるexport-data.jsonを読み込んでXMLとして表示します。unparsed-text()でテキストファイルとしてJSONを読み込み、読み込んだJSONをjson-to-xml()でXMLにします。


<xsl:param name="input" >export-data.json</xsl:param>     
<xsl:template name="xsl:initial-template">
      <xsl:copy-of select="json-to-xml(unparsed-text($input))"/>
</xsl:template>

結果のXMLを次に示します。

<?xml version="1.0" encoding="UTF-8"?><!--export-data.xml-->
<map xmlns="http://www.w3.org/2005/xpath-functions">
  <array key="items">
    <map>
      <string key="id">7646893/2E3MJB9A</string>
   <string key="type">book</string>
      <string key="title">スタイルシート開発の基礎</string>
      <string key="publisher">アンテナハウス株式会社</string>
      <string key="publisher-place">Tokyo</string>
      <string key="event-place">Tokyo</string>
      <string key="ISBN">978-4-900552-23-4</string>
      <string key="language">ja</string>
      <array key="author">
        <map>
          <string key="family">アンテナハウス株式会社</string>
          <string key="given"/>
        </map>
      </array>
      <map key="issued">
        <array key="date-parts">
          <array>
            <number>2016</number>
            <number>5</number>
          </array>
        </array>
      </map>
    </map>
  </array>
</map>

XML形式で出力せずに扱う方が便利なこともありますが、とりあえず今回のところは得られた引用データのXMLから一部を抜き取ってFOにしてみます。

<xsl:template match="j:string[@key='title']">
    <fo:inline font-family="sans-serif">『<xsl:value-of select="." />』</fo:inline>
</xsl:template>
<xsl:template match="j:map[@key='issued']">
    <xsl:apply-templates select="j:array[@key='date-parts']"/>
</xsl:template>
<xsl:template match="j:array[@key='date-parts']">
<fo:inline><xsl:value-of select="./j:array/j:number[1]" />年</fo:inline>
</xsl:template>
<xsl:template match="j:string[@key !='title']">
</xsl:template>

これをexport-data.xmlに適用します。かなり省略していますが、
export-data.xmlのtitledate-partsから年の値を取り出し、加工して出力できました。

<fo:inline font-family="sans-serif">『スタイルシート開発の基礎』</fo:inline><fo:inline>2016年</fo:inline>

CSLからXSLT、XSL-FOへの完全な変換まで到達予定でしたが、XPath3.1やXSLT3.0の機能を調べだしたら今回の記事に間に合わなくなったため、少し時間を空けて再挑戦したいところです。

*1 https://citationstyles.org/about/
*2 https://citationstyles.org/2010/03/22/citation-style-language-1-0/
*3 https://ja.wikipedia.org/wiki/Citation_Style_Language

関連記事

  1. Citation Style Languageの話(1)

Pages: Prev 1 2