月別アーカイブ: 2016年6月

XSLTを学ぶ (7) ステップの文法を追求する-軸とは

パスは、ステップを’/’オペレータで結合したものであること、そしてステップは、AxisSpecifier NodeTest Predicate*の形式または省略形で記述されることを前回まで[1]に学びました。

ステップの例として、child::para[position()=1]を取り上げてみます。child::が軸指定子(AxisSpecifier)であり、あるノードを起点とするとき、その起点ノードの子供を選択します[2]

その後のparaがNodeTestでノードの名前の指定であり、child::paraは、起点ノードの子供で名前がparaのノードを選択します。NodeTestには’*’を使うこともでき、child::*とすると起点ノードの子供であるノードをすべて選択します。

[position()=1]はオプションの述部(Predicate)です。この場合、述部はノード集合の中での最初のノードを選択します。

軸は起点のノードからXML文書のツリーの方向を指定します。第1回[3]で学びましたが、ノードには7種類があり、また、軸の名前にはancestor、ancestor-or-self、attribute、child、descendant、descendant-or-self、following、following-sibling、namespace、parent、preceding、preceding-sibling、selfの13種類があります。

この中でself軸は起点となるノード自身を含みます。起点ノードが要素ノードのとき、self、ancestor、descendant、following、precedingは一つのXML文書の(属性、名前空間を除外して)すべてのノードを網羅します。

例えば、次のようなXML文書を考えてみます。

<!–?xml version=”1.0″?–>
<doc>
<body>
<p s=”man1″>Hello! How are you?</p>
<p s=”man2″><img src=”pic1″/>I am fine, thank you.<img src=”pic2″/></p>
<p s=”man3″>I am fine, thank you.</p>
</body>
</doc>

このXML文書をノードのツリーで表します。仮に起点が二つ目の要素ノードpであるとします。このときself::はpノードです。そこを起点にしてancestor、descendant、following、precedingは次のような関係になります。

XSLT2

上の図では、selfの子供pの属性ノード(src=”pic1″など)は除外しています。第2回[4]で説明しましたように属性ノードは子供(child)にはなりません。XSLT仕様では、decendentは、「childまたはchildの子供である」とされています。従って、属性や(名前空間ノードも)decendentにはなりません[5]

また、属性や(名前空間ノードも)はprecedenig、followingからも除外されています。

上の図とは異なりますが、もし、属性ノードsrc=”pic1″がselfであった時は、ancestorはその親であるpノードからルートノードまでとなります[6]。しかし、 following-sibling、preceding-siblingは空です。

child、parentについては第2回[4]で説明しました。child軸、parent軸はそれぞれselfノードの子または親です。child軸は複数の子供ノードを含みます。parent軸はあるとしてもひとつの親ノードのみを含みます。

attribute軸、namespace軸はそれぞれselfの属性ノード、名前空間ノードを含みます。

[1] XSLTを学ぶ(3)パスとは
XSLTを学ぶ(6)ステップの文法を追求する
[2] XPathでは起点ノードを文脈ノードといいます。そして、以下の説明の起点ノードのところは文脈ノードになっています。
[3] XSLTを学ぶ(1)XMLのツリーモデルとXPath/XSLTのツリーモデルではルートの意味が違う
[4] XSLTを学ぶ(2)ノードツリーとノードの親子、子孫関係
[5] 2.2 Axes
[6] XPathの仕様の2.2 Axesには、文脈ノードのancestorは、文脈ノードの親(parent)と親の親、以下同じ、から成るとあります。そして、5.3 Attribute Nodesには、要素はそれに付随する属性ノードの親である、と書いてあります。従って、属性ノードのancestorにはその親である要素ノードを選択することになります。

【広告】

次回:
XSLTを学ぶ(8)ステップの文法を追求する-NodeTest

前回:
XSLTを学ぶ(6)ステップの文法を追求する

★AH Formatter XML関連出版物の紹介

初回:
XSLTを学ぶ(1)XMLのツリーモデルとXPath/XSLTのツリーモデルではルートの意味が違う


第61回「問55 1人では、規則第3条第5項第4号(適正事務処理要件)イ及びロに規定する要件を満たすことはできないのでしょうか。」

作成者:アンテナハウス株式会社 益田康夫
資 格:上級 文書情報管理士、簿記3級、行政書士
本ブログの記載内容は、公開日時点での法令等に基づいています。
その後の法令改定により要件が変わる可能性がありますので、最新の法令などをご確認下さい。

 

問55 私は、1人で建設業を営んでいます。この度、国税関係書類(契約書、領収書)のスキャナ保存をはじめようと考えていますが、1人では、規則第3条第5項第4号(適正事務処理要件)イ及びロに規定する要件を満たすことはできないのでしょうか。

個人事業主の方がスキャナ保存をすることを想定した曲論的なQAとなります。

沢山領収書が毎月発生して困っている個人事業主様には多少のニーズはあるかもしれません。

リーズナブルな会計事務所との連携やクラウド会計ベンダー様の工夫のしどころでしょうか?

 

回答

国税関係書類の作成又は受領から当該国税関係書類に係る記録事項の入力までの各事務の一部及び定期的な検査を外部の者に委託するなどの対応をすれば、同号イ及びロの各要件を満たすことはできます。

解説

規則第3条第5項第4号(適正事務処理要件)に掲げる事項1相互けんせい、2定期的なチェック、3再発防止策)について規程を整備するとともに、これに基づき事務処理を行うことが要件とされています。
1については、同号イにおいて、「各事務について、それぞれ別の者が行う体制」とされていることから、「1人」で各事務を行う場合には、この規定の要件を満たさないと考えられます。
しかしながら、「別の者」について特別の制限が設けられていないことから、外部の者を別の者と解することができるため、明確な事務分掌の下に、各事務の一部について委託し、別の者が行う体制としているのであれば、この規定の要件を満たすことはできると考えられます(どの事務を別の者が行うかについては、問56を参照願います。)。
また、2については、事務を担当している者が定期的な検査を行った場合、仮に紙段階で改ざんを行っているときには、自ら検査をしてもチェック機能が働かないこととなるため、「1人」で各事務を検査することは認められないと考えられます。
しかしながら、各事務を検査するのが外部の者でも差し支えありませんので、検査を外部の者に委託し、その者がその事務を担当していなければ、この規定の要件を満たすことはできると考えられます。
なお、上記により外部の者に委託している場合で、外部の者が同号ハに定める「当該各事務に係る処理に不備がある」と認めたときは、委託されている外部の者から同号ハに定める報告が行われる必要があります。

――【広告】――
・アンテナハウスは、中小企業皆様のペーパレス経理への挑戦をサポートします!
・「ScanSave(スキャンセーブ)」は、証憑書類のスキャナ保存の要件確保用の
安心、低価格、短期導入可能なパソコン用スタンドアロンソフトです!

 ScanSave-Lite  (ソフト単体)適時入力専用  12万円
 ScanSave  (ソフト単体)業務サイクル+適時入力   45万円
 ScanSave
適時入力導入支援パック
適時入力専用
タイムスタンプ2,000個/月+スキャナix100+導入支援付き
 38万円~
 ScanSave
業務サイクル入力導入支援パック
業務サイクル+適時入力
タイムスタンプ2,000個/月+スキャナix500+適正事務処理要件コンサルティング+導入支援付き
 100万円~

・詳しくは、 https://www.antenna.co.jp/scansave/ をご覧ください。
・問合わせは、 sis@antenna.co.jp まで


XSLTを学ぶ (6) ステップの文法を追求する

第3回([1])と前回([2])でパスには「式の構成部品としてのパス」(ロケーションパス)と「パターンの記述のためのパス」(パターンパス)の2種類あること、そしてロケーションパスは式の一部でありxsl:要素のselect属性で使われること。パターンパスは、match属性で使われることを説明しました。

パスを構成する文法を調べると、ステップがその基本的な単位になっています。パスはステップを’/’で結合して構成します。

そこで、ステップについてもう少し詳しく調べてみます。

1. ロケーションパスのステップは、XPath仕様[3]で決まっています。第3回でステップの文法の入り口として、次の項を紹介しました。

[4] Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep

ステップは軸の指定子(AxisSpecifier)とノードテスト(NodeTest)とオプション(*)の述部(Predicate)、または、省略形(AbbreviatedStep)から構成します。

ステップの省略形は ‘.’(自分自身、self::node()の省略形)、または’..’(親、parent::node()の省略形)です。

[12] AbbreviatedStep ::= ‘.’ | ‘..’

軸の指定子の定義は、次のようになっています。

[5] AxisSpecifier ::= AxisName ‘::’ | AbbreviatedAxisSpecifier
[6] AxisName ::= ‘ancestor’ | ‘ancestor-or-self’ | ‘attribute’ | ‘child’ | ‘descendant’ | ‘descendant-or-self’ | ‘following’ | ‘following-sibling’ | ‘namespace’ | ‘parent’ | ‘preceding’ | ‘preceding-sibling’ | ‘self’

軸の指定子は、軸の名前(AxisName)と’::’または省略形の軸指定子(AbbreviatedAxisSpecifier)で、軸の名前は’ancestor’から’self’まで13種類あります。

[13] AbbreviatedAxisSpecifier ::= ‘@’?

省略形の軸指定子はなにも指定しないか’@’です。なにも指定しないとデフォルトはchild::です。
@はattribute::の省略形です。その他、’//’は/descendant-or-self::node()/の省略形とされています(規則[11]省略)。

NodeTest以下は次のようになっていますが、次回以降もう少し詳しく調べてみます。

[7] NodeTest ::= NameTest | NodeType ‘(‘ ‘)’ | ‘processing-instruction’ ‘(‘ Literal ‘)’
[37] NameTest ::= ‘*’ | NCName ‘:’ ‘*’ | QName  
[38] NodeType ::= ‘comment’ | ‘text’ | ‘processing-instruction’ | ‘node’

NCName、QNameはXML名前空間([4])で規定されています。

[8] Predicate ::= ‘[‘ PredicateExpr ‘]’
[9] PredicateExpr ::= Expr 

述部は式(Expr)を'[‘ ‘]’で囲ったものです。

2. パターンの構成要素であるステップ(ステップパターン)は、XSLT仕様([5])で決まっています。その文法は次の通りです。

[5] StepPattern ::= ChildOrAttributeAxisSpecifier NodeTest Predicate*
[6] ChildOrAttributeAxisSpecifier ::= AbbreviatedAxisSpecifier
| (‘child’ | ‘attribute’) ‘::’

NodeTest、Predicate、AbbreviatedAxisSpecifierはXPathのステップを参照しています。XSLT仕様はXPath仕様を利用して作られていることがよく分かります。

[1] XSLTを学ぶ(3)パスとは
[2] XSLTを学ぶ(5)パターンの記述のためのパス
[3] XML Path Language (XPath) Version 1.0
[4] Namespaces in XML 1.0 (Third Edition)
[5] XSL Transformations (XSLT) Version 1.0
[6] 『スタイルシート開発の基礎』

【広告】★AH Formatter XML関連出版物の紹介

次回:
XSLTを学ぶ(7)ステップの文法を追求する-軸とは

前回:
XSLTを学ぶ(5)パターンの記述のためのパス

初回:
XSLTを学ぶ(1)XMLのツリーモデルとXPath/XSLTのツリーモデルではルートの意味が違う


第60回「問54 ・・規則第3条第5項第4号(適正事務処理要件)に規定する「次に掲げる事項に関する規程」とは具体的にどのような規程を整備すればよいのでしょうか。」

作成者:アンテナハウス株式会社 益田康夫
資 格:上級 文書情報管理士、簿記3級、行政書士
本ブログの記載内容は、公開日時点での法令等に基づいています。
その後の法令改定により要件が変わる可能性がありますので、最新の法令などをご確認下さい。

問54 当社は、代表取締役とその妻が経理部長を行い、2人で製品製造販売を営んでいる同族法人です。この度、国税関係書類(請求書、納品書、見積書(控)、注文書)のスキャナ保存を始めようと考えていますが、規則第3条第5項第4号(適正事務処理要件)に規定する「次に掲げる事項に関する規程」とは具体的にどのような規程を整備すればよいのでしょうか。

ここに「適正事務処理要件」のひな型PDFがリンク掲載されています。

回答

規則第3条第5項第4号(適正事務処理要件)に規定する、いわゆる、「適正事務処理要件」については、スキャナによる読み取り前の紙段階で行われる改ざん等の不正を防ぐ観点から必要な措置として要件とされたものです。
このため、中小企業や個人事業者においても、規則第3条第5項第4号に掲げる事項1相互けんせい、2定期的なチェック、3再発防止策)を社内規程等において整備し、事務処理を行うことで「適正事務処理要件」を満たすものと考えられます。
この社内規程等については、事業規模、書類の管理状況、別な規程の存在など(以下「事業規模等」といいます。)により、異なることとなりますが、ご質問のケースの規定は、例えば、次のようなものが考えられます(PDF/679KB)。
なお、適正事務処理要件を満たすため社内規程等をどこまで整備するのかについては、事業規模等を踏まえ、「改ざん等の不正を防ぐ」ことができるのかについて、判断する必要があることに留意してください。

――【広告】――
・アンテナハウスは、中小企業皆様のペーパレス経理への挑戦をサポートします!
・「ScanSave(スキャンセーブ)」は、証憑書類のスキャナ保存の要件確保用の
安心、低価格、短期導入可能なパソコン用スタンドアロンソフトです!

 ScanSave-Lite  (ソフト単体)適時入力専用  12万円
 ScanSave  (ソフト単体)業務サイクル+適時入力   45万円
 ScanSave
適時入力導入支援パック
適時入力専用
タイムスタンプ2,000個/月+スキャナix100+導入支援付き
 38万円~
 ScanSave
業務サイクル入力導入支援パック
業務サイクル+適時入力
タイムスタンプ2,000個/月+スキャナix500+適正事務処理要件コンサルティング+導入支援付き
 100万円~

・詳しくは、 https://www.antenna.co.jp/scansave/ をご覧ください。
・問合わせは、 sis@antenna.co.jp まで


第59回「問53 規則第3条第5項第3号は、「入力を行う者又はその者を直接監督する者に関する情報を確認することができるようにしておくこと」と規定していますが、電子署名を行うことによってもこの要件を満たしますか。」

作成者:アンテナハウス株式会社 益田康夫
資 格:上級 文書情報管理士、簿記3級、行政書士
本ブログの記載内容は、公開日時点での法令等に基づいています。
その後の法令改定により要件が変わる可能性がありますので、最新の法令などをご確認下さい。

問53 規則第3条第5項第3号は、「入力を行う者又はその者を直接監督する者に関する情報を確認することができるようにしておくこと」と規定していますが、電子署名を行うことによってもこの要件を満たしますか。

実印相当の電子署名の要件が削除されましたが、認印相当の電子署名は利用していいですよ!と言うことです。

回答

電子署名を行うことによって、入力を行う者又はその者を直接監督する者に関する情報を確認することができれば、この要件を満たします。

解説

平成27年度の税制改正により、国税関係書類をスキャナで読み取る際の電子署名の要件が不要とされ、これに代え、国税関係書類に係る記録事項の入力を行う者又はその者を直接監督する者に関する情報を確認できるようにしておくことが要件とされました。
このため、平成27年度の税制改正後において、規則第3条第5項第3号(入力者等の情報の確認)の規定は、電子署名を行うことを規定したものではありませんが、電子署名を行うことによっても、入力を行う者又はその者を直接監督する者に関する情報を確認することができるため、この要件を満たすと考えられます。

――【広告】――
・アンテナハウスは、中小企業皆様のペーパレス経理への挑戦をサポートします!
・「ScanSave(スキャンセーブ)」は、証憑書類のスキャナ保存の要件確保用の
安心、低価格、短期導入可能なパソコン用スタンドアロンソフトです!

 ScanSave-Lite  (ソフト単体)適時入力専用  12万円
 ScanSave  (ソフト単体)業務サイクル+適時入力   45万円
 ScanSave
適時入力導入支援パック
適時入力専用
タイムスタンプ2,000個/月+スキャナix100+導入支援付き
 38万円~
 ScanSave
業務サイクル入力導入支援パック
業務サイクル+適時入力
タイムスタンプ2,000個/月+スキャナix500+適正事務処理要件コンサルティング+導入支援付き
 100万円~

・詳しくは、 https://www.antenna.co.jp/scansave/ をご覧ください。
・問合わせは、 sis@antenna.co.jp まで


XSLTを学ぶ (5) パターンの記述のためのパス

前回[1]は、「式の構成部品としてのパス」を調べてみました。これはXPath仕様[2]で規定されているものです。

もう一つは、「パターンの記述のためのパス」があります。こちらはXSLT仕様[3]で規定されています。本書(『スタイルシート開発の基礎』[4])では、パターンについては、3.7.1 パタン(p.33)で触れています。しかし、パスの役割についてはあまり詳しく記述されていませんので、仕様書で少し詳しく調べてみます。

式は主にselectの属性の値として設定します。XSLT V1.0ではselect属性は次の要素に定義されています。

xsl:variable
xsl:param
xsl:apply-templates (ノード集合式のみ)
xsl:value-of (文字列式のみ)
xsl:with-param
xsl:sort (文字列式のみ)
xsl:copy-of
xsl:if(論理式のみ)
xsl:when(論理式のみ)
xsl:for-each(ノード集合式のみ)

パターンは、スタイルシート規則(xsl:template)のmatch属性の値として規定されています。これを含めてmatch属性が使えるのは次の三つの要素です。

xsl:template
xsl:key
xsl:number

XSLTのxsl:templateの説明の項(5 Template Rules)にはパターンについて書いてあります。それを読みますと、select属性の式は、主にソース文書から処理の対象とするノードのリストを作るのに使われるのに対して、パターンはノードに適用するテンプレート規則を識別するのに使うという関係のようです。

パターンの構文は、式の構文のサブセットです。具体的には次のようになっています。

[1] Pattern ::= LocationPathPattern
| Pattern ‘|’ LocationPathPattern

パターンは一つのロケーションパスパターンまたは、それを’/’オペレータでつなげたものです。

[2] LocationPathPattern ::= ‘/’ RelativePathPattern?
| IdKeyPattern ((‘/’ | ‘//’) RelativePathPattern)?
| ‘//’? RelativePathPattern

[3] IdKeyPattern ::= ‘id’ ‘(‘ Literal ‘)’
| ‘key’ ‘(‘ Literal ‘,’ Literal ‘)’

IDkeyPatternは式では出てきませんでしたが、IDまたはkeyとなっています。あとは式としてのロケーションパスの生成規則で出てきたもの(第(3)回[5]を参照)と大よそ対応しているようです。

[4] RelativePathPattern ::= StepPattern
| RelativePathPattern ‘/’ StepPattern
| RelativePathPattern ‘//’ StepPattern
[5] StepPattern ::= ChildOrAttributeAxisSpecifier NodeTest Predicate*
[6] ChildOrAttributeAxisSpecifier ::= AbbreviatedAxisSpecifier
| (‘child’ | ‘attribute’) ‘::’

ChildOrAttributeAxisSpecifierは、child軸とattribute軸のみになっています。

[1] XSLTを学ぶ (4) 式の構成部品としてのパスの使い方
[2] XML Path Language (XPath) Version 1.0
[3] XSL Transformations (XSLT) Version 1.0
[4] 『スタイルシート開発の基礎』
[5] XSLTを学ぶ (3) パスとは

【広告】★AH Formatter XML関連出版物の紹介

次回:
XSLTを学ぶ (6) ステップの文法を追求する

前回:
XSLTを学ぶ (4) 式の構成部品としてのパスの使い方

初回:
XSLTを学ぶ(1)XMLのツリーモデルとXPath/XSLTのツリーモデルではルートの意味が違う


第58回「問52 スキャナの読取サイズよりも大きい書類を受領した場合、その書類を分割するなどしてスキャナで読み取ることでも差し支えないでしょうか。」

作成者:アンテナハウス株式会社 益田康夫
資 格:上級 文書情報管理士、簿記3級、行政書士
本ブログの記載内容は、公開日時点での法令等に基づいています。
その後の法令改定により要件が変わる可能性がありますので、最新の法令などをご確認下さい。

「問52 スキャナの読取サイズよりも大きい書類を受領した場合、その書類を分割するなどしてスキャナで読み取ることでも差し支えないでしょうか。」

回答

ディスプレイの画面及び書面に規則第3条第5項第6号の要件を満たし、整然とした形式かつ原稿と同程度に明瞭な状態で、速やかに出力することができれば、どのような入力方法でも差し支えありません。

規則第3条第5項第6号の要件 とは何でしょうか?下記引用をご覧ください。

 当該国税関係書類に係る電磁的記録の保存をする場所に当該電磁的記録の電子計算機処理の用に供することができる電子計算機、プログラム、映像面の最大径が三十五センチメートル以上のカラーディスプレイ及びカラープリンタ並びにこれらの操作説明書を備え付け、当該電磁的記録をカラーディスプレイの画面及び書面に、次のような状態で速やかに出力することができるようにしておくこと。

 整然とした形式であること。
 当該国税関係書類と同程度に明瞭であること。
 拡大又は縮小して出力することが可能であること。
 国税庁長官が定めるところにより日本工業規格Z八三〇五に規定する四ポイントの大きさの文字を認識することができること。

解説

 規則第3条第5項第2号イ及びハにおいて、国税関係書類を読み取るに当たっての要件として200dpi以上、赤・緑・青それぞれ256階調以上及び書類の大きさに関する情報を保存することを規定していますが(同条第6項に規定する国税関係書類の場合は、いわゆるグレースケールで保存することが規定されており、また、書類の大きさに関する情報を保存する要件はありません。)、その他は特に規定していませんので、1頁の書類が2頁にまたがるなど、分割して出力されることなく原稿と同程度の出力ができる保存方法として規則第3条第5項第6号の要件を満たしていれば、入力方法については問わないこととされています。
したがって、本来はディスプレイに出力する際にファイル等が分割されることなく整然とした形式で出力することが必要であり、また、仮にA3の書類であれば当然にA3が出力できるプリンタ及びA3サイズの用紙を備え付けるべきですが、たまたま備え付けられているプリンタの最大出力サイズより大きい書類を1枚受領したときは、スキャン文書と元の書類の両方を保存することで差し支えありません。

(注) 備え付けられているスキャナがA3サイズに対応していないからといって、国税関係書類を複写機などで縮小コピーしたものをスキャニングすることは、法第4条第3項に規定する国税関係書類に記載されている事項をスキャニングすることには当たりません。

 

――【広告】――
・アンテナハウスは、中小企業皆様のペーパレス経理への挑戦をサポートします!
・「ScanSave(スキャンセーブ)」は、証憑書類のスキャナ保存の要件確保用の
安心、低価格、短期導入可能なパソコン用スタンドアロンソフトです!

 ScanSave-Lite  (ソフト単体)適時入力専用  12万円
 ScanSave  (ソフト単体)業務サイクル+適時入力   45万円
 ScanSave
適時入力導入支援パック
適時入力専用
タイムスタンプ2,000個/月+スキャナix100+導入支援付き
 38万円~
 ScanSave
業務サイクル入力導入支援パック
業務サイクル+適時入力
タイムスタンプ2,000個/月+スキャナix500+適正事務処理要件コンサルティング+導入支援付き
 100万円~

・詳しくは、 https://www.antenna.co.jp/scansave/ をご覧ください。
・問合わせは、 sis@antenna.co.jp まで


PDF Tool API/PDF Driver APIのオンラインマニュアルとサンプル集を掲載中です

みなさん、こんにちわ。
本日は「夏至」。1年でいちばん昼がなが~い日ですね。
帰宅する時間もまだ明るくてわけもなくうれしい日々も今日までか・・・
しかも今日は大雨です。
地域によっては被害が大きくなっていて、心配です。

PDF Tool API、PDF Driver APIのページについて、ちょっとお知らせです。
まず、
 ・説明書のオンライン化
製品版/評価版に付けているAPIリファレンスやPDFの説明書をオンラインにしました。
それ以外の細々した補足的説明書も作成してアップロードしています。
見栄えがイマイチでまだまだこれから手をいれてもっときれいなページにしたいとは思っていますが・・・。

 PDF Tool API 説明書
PDF Driver API 説明書

そして、
 ・サンプル集
サンプルコードは製品版/評価版に付いていますが、実際に結果はどうなるの?、というあたりは気になりますよね。
コードとともに元ファイルや結果ファイルを掲載して、どういうことができるのかをイメージしていただけたら幸いです。
・・・などと言いながら、かんじんの掲載数がぜんっぜん少なくて、スミマセン。
鋭意努力中です。
「こんなサンプルを載せてほしい」「こういうページ作りだともっとわかりやすい」等々ございましたら、ぜひお知らせください!

 PDF Tool API サンプル集
 PDF Driver API サンプル集

 


XSLTを学ぶ (4) 式の構成部品としてのパスの使い方

前回[1]はパス(ロケーションパス)の構成法を学びました。続いてパスの使い方を調べてみます。

スタイルシートで重要な役割を果たす要素の一つにxsl:apply-templatesがあります。XSLT[2]の5.4 Applying Template Rulesを見ますと、xsl:apply-templatesの定義は次のようになっています。

<xsl:apply-templates
 select = node-set-expression
 mode = qname>
 <!– Content: (xsl:sort | xsl:with-param)* –>
</xsl:apply-templates>

select属性を省略すると、xsl:apply-templatesはカレントノードのすべての子供を処理します。select属性の値に式を記述することで、処理対象とするノードの集合を限定できます。この式はどのように評価されるのでしょうか?

XSLTの5.1 Processing Modelを読むと、ノードにmatchするテンプレート規則の中から、あるテンプレート規則が選択されると、テンプレート規則はそのノードをカレントノードとして起動されるとあります。

本書[3]には次のような例(2.18の一部)が出ています。

<xsl:template match=”body”>
 <fo:page-sequence master-reference=”main”>
  <fo:flow flow-name=”xsl-region-body”>
   <xsl:apply-templates select=”p”/>
  </fo:flow>
 </fo:page-sequence>
</xsl:template>

<xsl:template match=”p”>
 <fo:block>
  <xsl:apply-templates/>
 </fo:block>
</xsl:template>

最初のブロックのテンプレート規則(xsl:template)は、(要素ノード)bodyにmatchしています。従って、最初のブロックではbodyがカレントノードです。

XPath[4]の式は文脈ノードで評価されます。XSLTの4 Expressionsを見ますと、最も外側の式(ある式の一部でない式)は文脈を次のように取得します。

a. 文脈ノードはカレントノードから
b. 文脈ノードの位置は、カレントノードリストにおけるカレントノードの位置から
c. 文脈ノードの大きさは、カレントノードリストの大きさから

こうして、最初のxsl:apply-templatesのselect属性の値である式p(child::pの省略記法)の文脈ノードはbodyになることが分かります。こうしてselect属性によりbodyの子であるpを選択したノード集合を作ることになります。(bodyの子のpではない要素ノードや、bodyの兄弟p要素ノードは対象になりません)。

[1] XSLTを学ぶ (3) パスとは
[2] XSL Transformations (XSLT) Version 1.0
[3] 『スタイルシート開発の基礎』
[4] XML Path Language (XPath) Version 1.0

【広告】★AH Formatter XML関連出版物の紹介

次回:
XSLTを学ぶ(5)パターンの記述のためのパス

前回:
XSLTを学ぶ (3) パスとは

初回:
XSLTを学ぶ(1)XMLのツリーモデルとXPath/XSLTのツリーモデルではルートの意味が違う


XSLTを学ぶ (3) パスとは

現在、5月にPOD出版した『スタイルシート開発の基礎』[1]を使って、毎週、社内で勉強会をしています。先週は第2回目でしたが、3.4.1 パス(p.21)の箇所で人によっては結構ひっかかりました。

本書はXMLをXSL-FOで本にするということがテーマなので、XSLTの基本説明はさっと流しています。詳しいことはあとで、実際に使えれば良いという実践的な指導書ともいえます。でもわからないことは詳しく調べてみるのも面白いものです。ということで、このあたりを少し調べてみました。

まず、パスについて調べてみます。XPath仕様[2]を見ますと、パス(ロケーションパス)の生成規則では、次のように絶対パスと相対パスの2種類があります。

LocationPath ::= RelativeLocationPath | AbsoluteLocationPath

絶対パスは次のように相対パスの先頭が’/’(ルートノード)になっているものです。

AbsoluteLocationPath ::= ‘/’ RelativeLocationPath? | AbbreviatedAbsoluteLocationPath

相対パスは次のように単一のステップまたは複数のステップを’/’で結合して構築します。

RelativeLocationPath ::= Step | RelativeLocationPath ‘/’ Step | AbbreviatedRelativeLocationPath

‘/’の意味が場所によって違うことで混乱しがちですが、先頭に’/’があったら、それはルートノードを意味し、ステップの間の’/’は結合用オペレータです。

ステップの生成規則は次のようになっています。

Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep

つまり、ステップの記述方法には省略記法(AbbreviatedStep)と軸指定から始める書き方(AxisSpecifier NodeTest Predicate*で構成する)の二通りがあります。本書の3.4.1パスには省略記法、3.4.2軸には軸指定から始める記法の例が載っています。

前回([4])の図のp要素を含むパスは、省略記法では

絶対パス:/doc/body/p
相対パス:body/p

という二種類の書き方があります。これだけですと、WebのURLなどのパスの書き方と似ています。しかし、軸指定から始める書き方では、次のようになり違いが明確です。

絶対パス:/child::doc/child::body/child::p
相対パス:child::body/child::p

【注意】pを含む相対パスは、起点の取り方により、上記以外にもいろいろ書けます。

属性ノードも指定できます。軸から書くとき、例えば次のようになります。

絶対パス:/child::doc/child::body/child::p/attribute::s
相対パス:child::body/child::p/attribute::s

attribute:: は省略記法では@になります。

テキストノードは次のように指定できます。

絶対パス:/child::doc/child::body/child::p/child::text()
相対パス:child::body/child::p/text()

すべての子要素ノードを表すときは次のようにも書けます。

絶対パス:/child::doc/child::body/child::*
相対パス:child::body/child::*

ここで述べたロケーションパスは式の構成要素となります(本書3.4.4)。他にパタン(本書3.7.1)としてのパスもあります。本書ではあまり詳しく書いてありませんが[4]、Micheal Kayさんの本によれば、第一と第二ではパスの意味合いが違うようです。もう少し詳しく調べてみます。

[1] 『スタイルシート開発の基礎』
[2] XML Path Language (XPath) – W3C
[3] XSLTを学ぶ (1) XMLのツリーモデルとXPath/XSLTのツリーモデルではルートの意味が違う
[4] XSLTを学ぶ (2)ノードツリーとノードの親子、子孫関係
[5] なんども書きますが、本書はXSLTやXPathそのものを詳しく学ぶ本ではありません。

【ご注意】筆者はXSLTを勉強中です。ここに書いた内容は、資料を調べながら正確を期していますが、間違いを含んでいる可能性もありますので、ご注意ください。

次回:
XSLTを学ぶ(4)式の構成部品としてのパスの使い方

前回:
XSLTを学ぶ (2) ノードツリーとノードの親子、子孫関係

初回:
XSLTを学ぶ(1)XMLのツリーモデルとXPath/XSLTのツリーモデルではルートの意味が違う


Pages: 1 2 Next