1

私は次のことをしたいと思っています: この時点で、いくつかの xml タグが間違って埋められているいくつかの xml ファイルを受け取ります。パートナーを支援するために、アプリケーションにインポートする前にすべての xml ファイルが配置されている「パススルー」フォルダーを使用して、これらの誤った値をキャッチしたいと考えています。

このフォルダーは X 分ごとに読み取られ、すべてのファイルについて、次のようないくつかのチェックを行う必要があります。タグ内の値の長さ、タグの値など。

これは一時的な解決策にすぎないため、アプリケーションに実装したくありません。

私は2つの可能なセットアップを考えていました:

  • Java を使用し、XSLT ファイルを呼び出してすべてのファイルを変換し、別のフォルダーに配置します。
  • javaのみを使用してxmlファイルをチェックし、変換を行います。どちらの場合も、X 分ごとに実行される .bat によって呼び出されます。

今私の質問:

  • それが最善の解決策になると思いますか?別名、最速、最も安全など(おそらく提案されたものとは異なるものですか?)
  • また、このようなことを行う方法の例をいくつか教えていただけますか?

私は厳密にコードを要求する他の人とは違います。似たようなものをいただければ、自分で作ることができます。この記事を書いている時点で、私はすでに他の Web サイトで解決策を探していますが、緊急であるため、コミュニティに質問することも役立ちます。

ご回答ありがとうございます。よろしくお願いします。

編集:両方の答えが私を大いに助けてくれました。君たちありがとう。

4

2 に答える 2

1

特定のフォルダー (OP の最初のオプション) 内のすべての XML ファイルに対して、.bat スクリプトを使用して XSLT を実行する場合は、次の 3 つの方法が考えられます。


A.基本的には、コマンド ライン経由で個々のファイルを処理するために「for」ループを実行します。(えー)


B.を使用collection()して入力フォルダーを指定し、 を使用xsl:result-documentして新しいフォルダーに出力ファイルを作成します。

XSLT 2.0 の例を次に示します(Saxon 9 でテスト済み)。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:param name="pInputDir" select="'input'"/>
  <xsl:param name="pOutputDir" select="'output'"/>
  <xsl:variable name="vCollection" select="collection(concat($pInputDir,'/?*.xml'))"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/">
    <xsl:for-each select="$vCollection">
      <xsl:variable name="vOutFile" select="tokenize(document-uri(document(.)),'/')[last()]"/>
      <xsl:result-document href="{concat($pOutputDir,'/',$vOutFile)}">
        <xsl:apply-templates/>   
      </xsl:result-document>
    </xsl:for-each>    
  </xsl:template>

</xsl:stylesheet>

ノート:

このスタイルシートは恒等変換を行っているだけです。XMLを変更せずに渡します。チェック/変更を行うには、新しいテンプレートを追加して ID テンプレートをオーバーライドする必要があります。

また、入力フォルダー名と出力フォルダー名には 2 つのパラメーターがあることに注意してください。

collection()を使用すると、フォルダー内のすべての XML ファイルがメモリに読み込まれるため、メモリの問題が発生する場合があります。これが問題である場合は、以下を参照してください...


C.ディレクトリ内のすべてのファイルのリストを XSLT で処理する。document()と Saxon 拡張関数を組み合わせて使用​​してsaxon:discard-document()、ドキュメントをロードおよび破棄します。

これは、テストのためにしばらく前に使用した例です。

XML ファイルのリスト (XSLT への入力):

<files>
  <file>file:///C:/input_xml/file1.xml</file>
  <file>file:///C:/input_xml/file2.xml</file>
  <file>file:///C:/input_xml/file3.xml</file>
  <file>file:///C:/input_xml/file4.xml</file>
  <file>file:///C:/input_xml/file5.xml</file>
  <file>file:///C:/input_xml/file6.xml</file>
  <file>file:///C:/input_xml/file7.xml</file>
  <file>file:///C:/input_xml/file8.xml</file>
  <file>file:///C:/input_xml/file9.xml</file>
  <file>file:///C:/input_xml/file10.xml</file>
</files>

XSLT 2.0 (Saxon 9 でテスト済み):

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:param name="pOutputDir" select="'output'"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="files">
    <xsl:apply-templates/>      
  </xsl:template>

  <xsl:template match="file">
    <xsl:variable name="vOutFile" select="tokenize(document-uri(document(.)),'/')[last()]"/>
    <xsl:result-document href="{concat($pOutputDir,$vOutFile)}">
      <xsl:apply-templates select="document(.)/saxon:discard-document(.)" xmlns:saxon="http://saxon.sf.net/"/>          
    </xsl:result-document>
  </xsl:template>

</xsl:stylesheet>

ノート:

繰り返しますが、このスタイルシートは恒等変換を行っているだけです。XMLを変更せずに渡します。チェック/変更を行うには、新しいテンプレートを追加して ID テンプレートをオーバーライドする必要があります。

また、出力フォルダー名のパラメーターしかないことにも注意してください。

于 2012-04-06T07:32:40.933 に答える