1

問題:

大量の XML ドキュメントがあります。このドキュメントは、PDF レンダリング エンジンで使用できるように準備する XSLT2 変換で最終的に使用される前に、少し渡されます。問題は、PDF レンダリング エンジンに到達するまでに実際に必要な XML の割合が、元のサイズに比べて小さいことです。他のプロセスにはまだ完全な XML が必要ですが、レンダリング エンジンへの「フロー」に関しては、理想的には、XML をできるだけ早く必要最低限​​の要素まで取り除き、渡されるデータの量を小さい。

プロセスの早い段階で最終的な XSLT2 変換を行うことはできません。これは、この直前に行われる XML 操作がもう少しあるためです。

したがって、元の XML ドキュメントの構造を単純に「保持」し、レポート目的で実際に関心のある XML 要素のみを保持する新しいスタイルシートを作成したいと考えています。必要な XSLT ドキュメントを作成できて非常に満足していますが、最終的な XSLT2 ドキュメントは複雑な獣なので、stackoverflow コミュニティの誰かが次のことを簡単に行う方法を持っていることを願っています。

理想的なソリューション:

参照されているすべての XML 要素 (つまり、それらの xPath) のリストを既存の XSLT2 スタイルシートから抽出する方法。selects/value-ofs/etc. だけでなく、fors/conditions/etc. にも参照される XML 要素を含めたいと考えています。

これには簡単な答えがないかもしれませんが、誰かが以前にこれを行ったことがある場合、または出発点を教えてくれる場合に備えて、どんな支援にも非常に感謝しています.

前もって感謝します!

4

3 に答える 3

0

冗長と見なされるタグのみをスキップして、以前とまったく同じ構造で新しいドキュメントに使用できるものをすべてコピーする XSLT スタイルシートが必要です。

次のスタイルシートはまさにこれを行います。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>

    <xsl:template match="/">
       <html><textarea rows="20" cols="120">
       <xsl:apply-templates />
       </textarea></html>
    </xsl:template>

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

   <xsl:template match="removeElmt1|removeElmt2|@removeAttr1|@removeAttr2">
   <!-- do nothing :) -->
   </xsl:template>

</xsl:stylesheet>

説明: XSLT はプログラミング言語ではなく、変換エンジンの仕様であることを忘れないでください。

最初のテンプレートはプロセスを開始することを指定し、2 番目のテンプレートは、3 番目のテンプレートで指定された要素と属性を除いて、すべてを照合してからすべてをコピーすることを指定します。

注: 要素または属性がドキュメントで再利用される場合、指定されたものだけを削除するために、3 番目のテンプレートの「一致」指定でより具体的な Xpath ステートメントが必要になります。

最初のテンプレートには、ブラウザーで結果を読み取るための 2 つの冗長な仕様が含まれています。<html>正確なコピーを得るには、および<textarea>仕様要素を削除し、出力方法を XML に設定する必要があります。

于 2015-05-17T10:41:45.707 に答える
0

最近の追加: ここで説明されていることは、多くの XQuery プロセッサ (Saxon を含む) で利用できるテクノロジである "ドキュメント プロジェクション" のように聞こえます。XQuery は、XSLT よりも静的分析に適しています (非常に動的なテンプレート ディスパッチ メカニズムがないため)。

ドキュメント プロジェクションは、ドキュメントとクエリを入力として取り、元のクエリに答えるために必要な元のドキュメントの部分のみを含むドキュメントを出力として生成します。利点は、ドキュメント プロジェクション プロセスがストリーミングされることです。元のドキュメントをメモリに構築する必要はありません。代わりに、プロジェクション プロセスは、XML パーサーからのイベントのフィルターとして機能します。

元の理論は、Amelie Marian 著、Jerome Simeon 著、2003 年、Projecting XML Documents、Columbia University Academic Commons、http://hdl.handle.net/10022/AC :P:29177 で説明されています。

于 2016-11-29T08:55:35.917 に答える
0

幸運を。私は既製のソリューションを知りません。

これを解決するには 2 つのアプローチが考えられます。どちらも非常に興味深いものであり、(一般的なケースでは) 多くの作業が必要です。このケースでは、XML を細くすることの利点が非常に価値がある場合、または特定のケースが非常に簡単であることが判明した場合にのみ、価値があります。一般的な場合より。

  1. テンプレートがノードを訪問するたびに、そのノードの ID を記録するように XSLT スタイルシートを装備できます (たとえば、単純な XPointer のスタイルでルートからの数値パスの形式で、または場合によっては完全修飾汎用識別子 (ドキュメント要素で始まり、訪問された要素に至る一連の要素名) 次に、2 番目のスタイルシートは、訪問されたノードのリストを読み取り、入力のコピーを作成し、各ノードに訪問済みとしてラベルを付けることができます。使用されているかどうか. 十分な入力に対してこれを行うと, (おそらく) XML を細くするために使用できるパターンが表示されます. 十分な入力に対してこれを行うと, 与えられた細分化プロセスが (a) 見逃されたかどうかを確認することができます.ドロップする可能性のあるもの、または (b) ドロップしてはならないものをドロップしました。

  2. ルート要素のテンプレートから始めて、可能な要素のどのクラスがどのテンプレートに一致するかに注目して、スタイルシートから抽象的に作業を試みることができます。入力ボキャブラリの適切なスキーマがあり、そのスキーマに対する妥当性を前提として想定できる場合、ここでの推論に役立つ場合があります。

これらはどちらも非常に困難です。2 つ目は、指定された XSLT 変換からの出力が特定の出力に対して有効であるかどうかを事前に予測できるようにするために、モノの型の理論家が試みている種類のものによく似ています。 、有効な入力が与えられます。そして残念なことに、これまでのその作業の要約は、「まあ、それは難しい!」のようです。一方、あなたのタスクは彼らのタスクよりも少し単純です。知りたいことは、変換を見て、XML ドキュメントの特定の分岐が変換の出力に影響を与えないことを事前に確認できるかということだけです。また、一般的なケースでそれを解く必要はありません。1 つの特定の変換についてのみ解く必要があります。

于 2013-02-08T17:31:35.397 に答える