2009-05-08 3 views
1

ちょっと、私は深く(ルートを含む)5つのノードの深さが壊れている必要がある非常に反復的なデータを持っています。 (私は速いサンプルを1分で含めるつもりだ)私がやってみたいのは、〜5MBのXMLファイルを3番目の深さのノードに基づくより小さなサブファイルに解析することです。しかし、その後、それはより複雑になります。XSLTを使用してXMLをサブファイルに解析できますか? (+代替言語/方法)

タスクの要件は以下のとおりです。

  1. サブファイルは、その属性を含む、抽出された第3レベルのノードの階層的な親を維持する必要があります。
  2. サブファイルはすべての属性と子ノードを保持する必要があります。
  3. XSLTがジョブを処理できない場合は、Rubyで試してみてください。 XSLTがうまくいかないが、RubyやPythonでそれを行う方法を教えていただけたら、それらの言語で回答を寄せてください。(そうでなければ試してみて、XSLTまたは擬似コードに固執する。)

DOM階層:その子と直接の両方を保持したまま、私はマイナーグループ要素に分割する必要があり

<xml attr="whatever"> 
    <major-group name="whatever"> 
    <minor-group name="whatever"> 
     <another-group name="whatever"> 
     <last-node name="whatever"></last-node> 
     </another-group> 
    </minor-group> 
    </major-group> 
</xml> 

両親を作成し、すべてのファイルを(各マイナーグループごとに)外部ファイルに保存します。私はこの方法で分割するいくつかのファイルを持っています。

... RubyでXMLを解析する前に、XSLTを使用し始めたばかりなので、まだどちらかで自分のタスクを達成するためのスクリプトを書くことはできません。

私は、XSLTがタスクに対応しているかどうかを知りたいと思っています。 :>

編集:

ここに私の結果のコードは、ファイルの先頭にスタイルシートを表示する機能で、です。

l
<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml"/> 
    <xsl:template match="minor-group"> 
    <xsl:variable name="filename"><xsl:value-of select="concat(@name,'.xml')"/></xsl:variable> 
    <xsl:result-document href="{$filename}"> 
     <xsl:text disable-output-escaping="yes"> 
     <![CDATA[<?xml-stylesheet type="text/xsl" href="../web.xslt"?>]]> 
     </xsl:text> 
     <xml> 
     <xsl:attribute name="whatever"><xsl:value-of select="../../@whatever" /></xsl:attribute> 
     <major-group> 
      <xsl:attribute name="whatever"><xsl:value-of select="../@whatever" /></xsl:attribute> 
      <xsl:copy-of select="."/> 
     </major-group> 
     </xml> 
    </xsl:result-document> 
    </xsl:template> 
</xsl:stylesheet> 
+0

XSLTを大幅に改善することができます。私はあなたにお見せしますが、XSLT 1.0をまったく使用できるかどうかはわかりません。複数の出力ファイルが必要だと思いましたか? – Tomalak

+0

XMLはv1、XSLTは2.0です。私はSaxon .NETインターフェイス経由で実行します。私の必要に応じてファイルを出力します。 –

答えて

3

"マイナーグループ"要素のリストを抽出するには、次のXPath式のいずれかが必要です。お好みのスクリプト言語で

 
/xml/major-group/minor-group (the explicit way) 
/*/*/*       (the generic, any-third-level-element way) 

、DOMにドキュメントを読んで、異なる出力ファイルに結果を書き込み、XPathクエリをループを構築します。

XSLT 1.0では、一度に複数の出力ドキュメントを生成することはできません。 Hovever、XSLT 2.0はこれを<xsl:result-document> instructionでサポートしています。

XSLT 2.0エンジンを自由に使えたら、そのルートを試すことができます。 IBMのdeveloperWorks Webサイトで見つけたランダムなページに、開始方法が示されています。Tip: Create multiple files in XSLT 2.0

+0

XSLT 2.0のヒントをお寄せいただきありがとうございます。これは私の問題を解決するはずですが、まずそれをテストします。 –

0

単純にXSLTを使用して1つのファイルを複数の出力ファイルに解析することはできません。

XMLをRubyで別のXMLファイルに分割し、別のXMLファイルをXSLTに複数回適用すると、それはうまくいくはずです。

+0

これは以前はApacheのXalanで可能でしたが、http://www.abbeyworkshop.com/howto/xslt/xslt_split/index.htmlではなくなりました。私はGoogleを介して他の関連する結果が見つかりませんでした。 :/(それ以外は、RubyやXSLTのいずれかでやりたいことですが、Rubyですべてを保存する方法はわかりません) –

+0

@Flea:そのサンプルはXalanへのリダイレクト拡張を参照しています。 Xalan-J(Java版Xalan)のように見えます。http://xml.apache.org/xalan-j/extensionslib.html#redirect –

+0

入手方法や使用方法がわかりません。私はJavaに触れていません。私はそれを見て.... ..../ –

関連する問題