みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
FileMaker提供のXMLとXSLTのサンプルがありますが、1レコードのみのインポートのためのXSLTの記述方法を教えてください。
すなわち、以下の1人分のXMLデータから、「斎藤」「麗子」「赤」「100」だけをFilemakerインポート用に変換するXSLTの記述を知りたいのです。
<?xml version="1.0" encoding="utf-8"?>
<root>
<child>
<氏>斉藤</氏>
<名>麗子</名>
<グループ>赤</グループ>
<スコア>100</スコア>
</child>
</root>
Filemaker提供のXSLTサンプルは複数人(複数レコード)のインポートに対応した記述になっています。
これを適宜省略して1レコード用の記述に変更したいのです。
↓↓↓
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/*">
<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
<ERRORCODE>0</ERRORCODE>
<PRODUCT BUILD="" NAME="" VERSION=""/>
<DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="" NAME="" RECORDS="{count(/*/*)}" TIMEFORMAT="h:mm:ss a"/>
<METADATA>
<xsl:for-each select="/*/*[position()=1]/*">
<FIELD>
<xsl:attribute name="EMPTYOK">YES</xsl:attribute>
<xsl:attribute name="MAXREPEAT">1</xsl:attribute>
<xsl:attribute name="NAME"><xsl:value-of select="name()"/></xsl:attribute>
<xsl:attribute name="TYPE">TEXT</xsl:attribute>
</FIELD>
</xsl:for-each>
</METADATA>
<RESULTSET>
<xsl:attribute name="FOUND"><xsl:value-of select="count(child::*)"/></xsl:attribute>
<xsl:for-each select="child::*">
<ROW>
<xsl:attribute name="MODID">0</xsl:attribute>
<xsl:attribute name="RECORDID">0</xsl:attribute>
<xsl:for-each select="child::*">
<COL>
<DATA>
<xsl:value-of select="."/>
</DATA>
</COL>
</xsl:for-each>
</ROW>
</xsl:for-each>
</RESULTSET>
</FMPXMLRESULT>
</xsl:template>
</xsl:stylesheet>
サンプルのXSLTは以上となっていて、素人目にも1レコードインポート用の記述としては長すぎると思います。
どの部分を削除すればいいのですか?
Offline
1レコード用に変更してもfor-eachが1つ無くなるぐらいで「長すぎる」点は変わらないと思います。
例えば前半のMETADATAは、どんなデータであっても必要な部分です。
それで動くならそのまま使えばいいのでは。
それとも元のXMLデータが複数レコードであっても最初のレコードだけ変換するように直したいということですか?
XSLTがわからないなら、単純にXML全体を1フィールドに取り込んで、Position()などで切り出したほうが分かりやすいと思います。
himadanee様
>1レコード用に変更してもfor-eachが1つ無くなるぐらいで「長すぎる」点は変わらないと思います。
>例えば前半のMETADATAは、どんなデータであっても必要な部分です。
>それで動くならそのまま使えばいいのでは。
早速のご回答ありがとうございます。今晩やってみます。
Offline
テキスト処理したほうが簡単ですね。"斉藤" を取り出すには、
Let (
[
xml = テキスト ;
tag = "氏" ;
stag = “<“ & tag & “>” ;
etag = “</“ & tag & “>” ;
xml = Substitute ( xml ;[ ¶ ; "" ];[ stag ; stag & ¶ ];[ etag ; ¶ & etag ])
] ;
MiddleValues ( xml ; 2 ; 1 )
)
Last edited by Shin (2023-09-05 22:01:15)
Offline
Shin様、ご回答ありがとうございます。
その方法も試してみます
Offline
カスタム関数に仕立てておくと便利ですよ。
上の式で、xml tag を引数に指定しておくと、
fnc ( テキスト ; “氏” )
で、斉藤 が戻ります
Last edited by Shin (2023-09-05 22:19:39)
Offline
XSLTがわからないなら、単純にXML全体を1フィールドに取り込んで、Position()などで切り出したほうが分かりやすいと思います。
XSLTのサンプルを色々弄ってみていますが全く望みの結果が得られませんでした。
したがってhimadanee様の上記アドバイスに従おうと思います。
実際以下のようなXMLのインポートを試みていました。
己の知識とスキルの圧倒的な低さを鑑み、このたび方針転換し、
差し当たり含まれる文字&数字データを見やすいように表示させられれば御の字と考えるようになりました。←それをターゲットのフィールドに適宜コピペします。面倒ですが。。。
本来はインポートしたそれぞれの文字&数字データをそれぞれのターゲットフィールドに自動的に納めたいのですが、自分のレベルが圧倒的に低すぎて本業のスキマ時間での生半可な作業では到底対応できず、いよいよ本業に差支えも出そうになってきたので断念しました。。
インポートしたいXML(*には数字や文字が入っている)
↓↓↓
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<XmlMsg>
<MessageHeader>
<ProcessExecutionTime>***************</ProcessExecutionTime>
<CharacterCodeIdentifier>*</CharacterCodeIdentifier>
<SegmentOfResult>*</SegmentOfResult>
<QualificationConfirmationDate>********</QualificationConfirmationDate>
<ReferenceClassification>*</ReferenceClassification>
<ArbitraryFileIdentifier>**************=</ArbitraryFileIdentifier>
<MedicalInstitutionCode>*********</MedicalInstitutionCode>
</MessageHeader>
<MessageBody>
<ResultList>
<ResultOfQualificationConfirmation>
<Address>*******************************</Address>
<SpecificHealthCheckupsInfoConsTime>**************</SpecificHealthCheckupsInfoConsTime>
<DiagnosisInfoConsFlg>*</DiagnosisInfoConsFlg>
<SpecificHealthCheckupsInfoAvailableTime>**************</SpecificHealthCheckupsInfoAvailableTime>
<PersonalFamilyClassification>*</PersonalFamilyClassification>
<Sex1>*</Sex1>
<SpecificDiseasesCertificateRelatedConsFlg>*</SpecificDiseasesCertificateRelatedConsFlg>
<OperationInfoConsFlg>*</OperationInfoConsFlg>
<Name>*******</Name>
<InsurerNumber>*******</InsurerNumber>
<InsuredCardSymbol>**</InsuredCardSymbol>
<NameKana>********</NameKana>
<InsuredCardValidDate>********</InsuredCardValidDate>
<LimitApplicationCertificateRelatedConsFlg>*</LimitApplicationCertificateRelatedConsFlg>
<InsuredCardClassification>**</InsuredCardClassification>
<InsuredBranchNumber>**</InsuredBranchNumber>
<Birthdate>********</Birthdate>
<InsuredCertificateIssuanceDate>********</InsuredCertificateIssuanceDate>
<InsuredIdentificationNumber>******</InsuredIdentificationNumber>
<PharmacistsInfoAvailableTime>**************</PharmacistsInfoAvailableTime>
<SpecificHealthCheckupsInfoConsFlg>*</SpecificHealthCheckupsInfoConsFlg>
<PharmacistsInfoConsTime>**************</PharmacistsInfoConsTime>
<PharmacistsInfoConsFlg>*</PharmacistsInfoConsFlg>
<InsurerName>****</InsurerName>
<PostNumber>**********</PostNumber>
</ResultOfQualificationConfirmation>
</ResultList>
<ProcessingResultStatus>*</ProcessingResultStatus>
<QualificationValidity>*</QualificationValidity>
</MessageBody>
</XmlMsg>
「XML全体を1フィールドに取り込んで、Position()などで切り出す」とは一体どういうことなのでしょうか?
XMLをテキストフィールドに取り込もうとするとXSLTを抱き合わせのXMLインポートダイアログが開いてしまい、テキストとして開くことができません。。。
Offline
テキスト処理したほうが簡単ですね。"斉藤" を取り出すには、
Let (
[
xml = テキスト ;
tag = "氏" ;
stag = “<“ & tag & “>” ;
etag = “</“ & tag & “>” ;
xml = Substitute ( xml ;[ ¶ ; "" ];[ stag ; stag & ¶ ];[ etag ; ¶ & etag ])
] ;
MiddleValues ( xml ; 2 ; 1 )
)
↑↑↑
これはXSLT内の記述でしょうか???
それとも目的のXMLをメモ帳か何かで開いて、その文字列を特定のフィールドにコピペして、それから処理するやり方やり方のことでしょうか?
己のレベルが圧倒的に低すぎて、この質問が適切かどうかもわかりません。すみません。。
Offline
https://community.claris.com/ja/s/quest … 6EfWakCAF/
内容と投稿時期に類似点がありますがもしマルチポストでしたら展開していないほうはクローズしたほうが良いでしょう。
マルチポストはマナー違反として好まれないことが多いでしょう。
Offline
オンライン資格認証の取り込みですか。
xmlをテキストとして適当なフィールドにインポートします。その中身を取り出します。
簡単なサンプルです。レイアウトを2個用意してあります。
https://www.dropbox.com/scl/fi/r0tbd7ro … oecvk&dl=0
xml の技術はタグ付きテキストとして基本的なものですので覚えておいた方がいいです。xsltも覚えればいいでしょうが、結構厄介なものですし、将来的に発展してという見込みもないですし、他への応用も効きませんし、どうでしょうね。
現実には、定型のxmlを作れて、その内容を取り出せれば十分な気もしますので、テキスト処理で済ましてしまえばいいのでは、と思います。
乱暴な話、#! のxml を生成するに、例えば、
Let (
[
xml =
"<?xml version="1.0" encoding="utf-8"?>¶<root>¶ <child>¶
<氏>fname</氏>¶
<名>sname</名>¶
<グループ>group</グループ>¶
<スコア>score</スコア>¶ </child>¶</root>"
] ;
Substitute ( xml ;[ "fname" ; $fname ]:[ "sname" ; $sname ]:[ "group" ; $group ]:[ "score" ; $score ])
)
みたいな感じで作ってしまったほうが早いでしょうね。
Last edited by Shin (2023-09-06 13:08:22)
Offline
#10に同意見です。
だいぶ前にせっせと勉強はしましたが、、、XSLTは考え方が独特なので、、、
一旦使われだした領域では継続性からずっと使われていくんでしょうけど
結局XMLという構造自体が無駄が多いので、JSONの方が流行ってる感じだと思います。
(「インポートしたいXML」を見ても、「*には数字や文字が入っている」が文字数的に省略されてるとしても、実際のデータよりタグの方が量が多いのは明白です)
https://community.claris.com/ja/s/quest … 6EfWakCAF/
内容と投稿時期に類似点がありますがもしマルチポストでしたら展開していないほうはクローズしたほうが良いでしょう。
マルチポストはマナー違反として好まれないことが多いでしょう。
削除できないのです。
Your administrator has disabled feed post and comment deletions.
削除を試みたのですが、上記のような文言が表示され削除できないのです。
お手数ですが削除の方法も教えていただけますか?
Offline
解決しました、とか、別のスレッドに移りました、などのコメントを追加しておけばいいでしょうね。
Last edited by Shin (2023-09-06 13:14:52)
Offline
あちらのコミュニティの仕様はよく分かりませんが削除は管理者しかできないのかも知れませんね。
マルチポストしてしまったときはShinさんが書かれているように状況を書いて
解決に至ったほうのURLなど添えておくと後々検索でトピックにたどり着いた人の役に立ちそうですね。
Offline
オンライン資格認証の取り込みですか。
そうです。
ご用意いただいたサンプルにて、右側の大きなテキストフィールドにXMLのテキストをコピペすることで、左側の細目のフィールド群に得たいものが得たい形で表示されるようになりました。ありがとうございました。
ただマイナンバーカードから読み取った保険証データはXMLファイルとしてローカルフォルダに保存されているので、
XMLファイルをそのまま件のテキストフィールドにつまんで持ってくると、FileMakerのXMLファイルインポートのダイヤログが開いてしまい、それをテキストとして取り込むことができません。
XMLファイルをメモ帳で開いて内容テキストをコピー&ペーストするか、メモ帳で開いたそのファイルを.txtファイルとして保存し、それをつまんで当該フィールドに持ってくるか、といったアクション数の多い作業になってしまっています。
なんだか面倒くさいのですが、差し当たり仕方ないのでしょうか?
それとも、今回新たにご提案いただいた、以下の
Let (
[
xml =
"<?xml version="1.0" encoding="utf-8"?>¶<root>¶ <child>¶
<氏>fname</氏>¶
<名>sname</名>¶
<グループ>group</グループ>¶
<スコア>score</スコア>¶ </child>¶</root>"
] ;
Substitute ( xml ;[ "fname" ; $fname ]:[ "sname" ; $sname ]:[ "group" ; $group ]:[ "score" ; $score ])
)
は、その面倒な事象に対する対応策なのでしょうか???
Offline
#! のxml を生成するものです。
ファイルの取扱いは、オブジェクトフィールドを作っておき、そこにファイルをドロップします。(テキストフィールドにドロップできました?)
そのトリガーで、そのファイルをテンポラリーフォルダーへ、ファイル名を変更(xxx.txt)してエクスポートし、それを、URLから挿入でインポートすればいいはずです。
Last edited by Shin (2023-09-06 18:52:04)
Offline
>テキストフィールドにつまんで持ってくる
テキストでなくオブジェクトフィールドなら入れられます。
ファイル内容はGetContainerAttribute()ではなぜか取得する方法がないので
HexDecode ( HexEncode ( テーブル::オブジェクトフィールド ) )
とかやります。
#! のxml を生成するものです。
Shin様、「#!」が何を指すのか教えていただけますか?
また、ご案内いただいた、
Let (
[
xml =
"<?xml version="1.0" encoding="utf-8"?>¶<root>¶ <child>¶
<氏>fname</氏>¶
・・・・・(中略)・・・・・
] ;
Substitute ( xml ;[ "fname" ; $fname ]:[ "sname" ; $sname ]:[ "group" ; $group ]:[ "score" ; $score ])
)
は、どこに記すべき計算式でしょうか?インポート用(ドラッグ&ドロップ用)のオブジェクトフィールドなのでしょうか???
また当方がインポートせんとするXMLファイルの場合、例えば「<氏>fname</氏>¶」と記述された箇所は「<name>氏名</name>¶」として、
インポート先の「氏名」フィールドに name が収まるように意図したものなのでしょうか???
質問になっていなかったらすみません(-_-;)
Offline
>テキストフィールドにつまんで持ってくる
テキストでなくオブジェクトフィールドなら入れられます。ファイル内容はGetContainerAttribute()ではなぜか取得する方法がないので
HexDecode ( HexEncode ( テーブル::オブジェクトフィールド ) )
とかやります。
himadanee様
折角ご助言いただいたのですが、当方のFMはバージョン8で、HexDecode関数が存在しないようです。。
Offline
#! のxml を生成するものです。
ファイルの取扱いは、オブジェクトフィールドを作っておき、そこにファイルをドロップします。(テキストフィールドにドロップできました?)
そのトリガーで、そのファイルをテンポラリーフォルダーへ、ファイル名を変更(xxx.txt)してエクスポートし、それを、URLから挿入でインポートすればいいはずです。
↑↑↑
Shin様からきっと貴重なご助言を頂戴している筈なのですが、わたくしの理解が「#8」までで止まっており、それ以降の皆様の発言を殆どというか全く理解できていません。。
なお、作成したオブジェクフィールドにXMLファイルをドロップはできましたが、アイコン付きのファイルがそこに収まっただけです、(もちろんテキストフィールドにはドロップすらできませんでした)
Shin様のお話を自分なりに解釈すると、
とある設定によって、オブジェクトフィールドにXMLファイルをドロップすると、それがトリガーとなって、ドロップされたXMLファイルがテンポラリーフォルダーに格納され、
そこでファイルの拡張子が「.xml」から「.txt」に変更される。
そのファイルが収まっているテンポラリーフォルダーのURLを「URLから挿入」の際に指定したうえで件の.txtファイルを指定のフィールドにインポートする。
って感じでしょうか?
Offline
FM8 では、素の機能では無理かも。
[MBS プラグイン が FM7 以降をサポートしているので、それを使えばできそうです。XML.ReadFile が使えそうです。頑張って英語のマニュアルを読んでください。
環境は、最初に書いてくださいね。
最後に、機微な情報を扱うのでしたら、メンテナンスされている(メーカーにサポートされている)環境が必要です。最近厚労省がガイドラインを出してきましたが、最新のバージョンにとかなり厳格に書かれています。漏洩を起こしたら、言い訳できませんよ。
Last edited by Shin (2023-09-07 02:48:11)
Offline
環境は、最初に書いてくださいね。
色々すみませんでした。
FilemakerPro12も10年以上も前に導入済みで先日からはFilemaker2023の試用版も使い始めていました。
ただデータの変換が一部でうまくいかず、結局FilemakerPro8をメインで使い続けている状況です。
FilemakerPro12もFilemaker2023も重たい集計作業がFilemakerPro8よりも安定しているのでその点において移行したいのですが、
FilemakerPro12もFilemaker2023もポータルとの間を行き来するスクリプトが特にバグってしまうようで、それを解決しないことには移行できそうにありません。
そんな訳でFilemakerPro8を使い続けてきましたが、やっぱり古いFilemakerはもうダメなんですね。。。
色々ありがとうございました。
Last edited by 完全素人 (2023-09-07 06:12:21)
Offline
fm7からfmp12への移行は、割とスムーズです。
そのおかしな動きの部分も、計算フィールドの評価タイミングが少し変更されていますので、それの影響かもしれません。そのトラブルについて、別のスレッドで相談してみられてはいかがでしょう。
Offline
Pages: 1
[ Generated in 0.009 seconds, 10 queries executed - Memory usage: 611.28 KiB (Peak: 648.19 KiB) ]