5

「まだ一致/処理されていないノード」を一致させることは可能ですか? 現在の順序が重要であるため、スタイル シートを巨大な for-each/Choose ステートメントにしないことが望ましいです。

プロジェクトはまだ開発中であり、ライブ環境で既に使用されているため、コードは簡単に言えば、取得しているライブ データに応じて急速に変化する状態にあります。XML から FO を介して PDF ドキュメントを生成しています。まだ知らないノードが含まれている可能性があり、XSL-FO 変換に「フェイルオーバー」命令を追加して、ドキュメントの先頭にあるすべての不明なノードを明るい赤で配置したいと考えています。発見をスピードアップします。

データを処理する必要があるため、驚きのノードを無視することはできません。「孤立した」データをより早く見つけることができれば、より迅速に適切に処理してドアの外に出すことができます。

さまざまな priority="" 設定をいじってみまし<xsl:template match="*">...</xsl:template>たが、もちろんすべてのノードに適用されます。

たとえば、これらの XML ブロックが正しい出力順序で来るとは限らないため、これを 1 つのセクションに含める場合があります。(コード ブロックの書式設定が機能しません。4 つのスペースでインデントしても何も起こりません。申し訳ありません :(

<xsl:template match="AccountSummary">
    <fo:block margin-left="2" space-before="1" space-after="1" text-align="center">
        <xsl:apply-templates select="Label"/>
    </fo:block>
    <xsl:apply-templates select="AccountInfo"/>
    <xsl:apply-templates select="AccountProfile"/>
    <xsl:apply-templates select="ChangeInValueOfAccounts"/>
    <!-- ... more goes here -->
</xsl:template>

私は次のようなことをしたいと思います

<xsl:template match="AccountSummary">
    <fo:block margin-left="2" space-before="1" space-after="1" text-align="center">
        <xsl:apply-templates select="Label"/>
    </fo:block>
    <xsl:apply-templates select="AccountInfo"/>
    <xsl:apply-templates select="AccountProfile"/>
    <xsl:apply-templates select="ChangeInValueOfAccounts"/>
    <!-- ... more goes here -->
    <xsl:for-each select="not otherwise matched">
        <!-- call zomgRED template -->
    </xsl:for-each>
</xsl:template>

理想的にはzomgREDs を一番上にしたいのですが、一番下でもうまくいきます。または、テキスト マーカーでフラグを立てます。静かにそれを食べるのではなく、最終的なドキュメントのテキストを吐き出すためのもの.

4

3 に答える 3

2

探しているもののフレーバーを取得できる方法を次に示します。未処理のノードを一番上に押し上げることはありませんが:

1) スタイルシートに恒等変換を含める:

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

2)<xsl:apply-templates select="*"/>他のすべてのより具体的なテンプレートから呼び出して、パーサーを実行できるようにしてください

アイデアは、特定のテンプレートが XSL-FO への意図した変換を処理し、恒等変換が他のすべてを結果ツリーにダンプするだけであるということです。再帰呼び出しにより、実際にすべてのノードにアクセスできるようになり (これが、それらを「オン レコード」にする唯一の方法です)、恒等変換は、他の方法ではキャッチできなかったノードと一致します。

その 2 番目のアドバイスは、実際には XSL-FO ロジックの邪魔になる可能性があるため、実際には実行可能ではない可能性があります。入力例と現在の XSL-FO 変換がないとわかりません。多分それを質問に追加しますか?

于 2012-05-04T19:01:04.830 に答える
0

:元の回答は、更新された質問に基づいて完全に置き換えられました。

そうすることもできますが、zomgRed テンプレートを再度取得したくない項目をリストする必要があります。

<xsl:template match="AccountSummary"> 
    <fo:block margin-left="2" space-before="1" space-after="1" text-align="center"> 
        <xsl:apply-templates select="Label"/> 
  </fo:block> 
  <xsl:apply-templates select="AccountInfo"/> 
  <xsl:apply-templates select="AccountProfile"/> 
  <xsl:apply-templates select="ChangeInValueOfAccounts"/> 
  <-- ... more goes here --> 
    <xsl:apply-templates mode='fallback' select * />

</xsl:template>

<xsl:template match='AccountInfo|AccountProfile|ChangeInValueOfAccounts| ... more goes here' mode='fallback' />

<xsl:template match='*' mode='fallback'>
   <!-- call zomgRED template --> 
</xsl:template>

for-eachyourを別のに置き換えましapply-templatesたが、現在はモードを使用しています。同じモードのテンプレートのみが一致します。「*」に一致するテンプレートはそのモードでのみ一致するため、他のインスタンスでは呼び出されません。1 行のテンプレートは同じモードで一致し、既に処理したすべてのノードに一致し、何もしません。「*」より具体的であるため、これらのノードの「*」テンプレートの代わりに実行されます (何もしません)。

ノードの重複リストを含む単一行テンプレートの代わりに、既存のすべてのテンプレート (AccountInfo、AccountProfile など) とそれぞれの apply-templates ステートメントに同じモードを追加できます。それはスタイルの問題であり、どちらがより保守しやすいかです。

于 2012-05-04T19:16:57.177 に答える
0

これを行う方法の例を次に示します(一致しないノードのみを追跡します。必要に応じて、一致しない属性の追跡を同じ方法で実装できます)。

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

 <!-- Catch all node - types template -- must be the top-most -->
 <xsl:template match="node()">
  Warning: this node is unmatched by any templates:

  "<xsl:copy-of select="."/>"
 </xsl:template>

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

 <xsl:template match="num[following-sibling::num[1] -1 = .]">
  <xsl:copy-of select="."/>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用される場合: (この単純なソリューションを説明するために、意図的に非常に単純なものが選択されています)

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

1 つの一致しない要素に対する警告を含む結果が生成されます。

<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
  Warning: this node is unmatched by any templates:

  "<num>10</num>"

:スタイルシートが他のスタイルシートをインポート/インクルードする場合、このソリューションは機能しません。このような場合、キャッチオール テンプレートは、最初に来る (またはインポートの優先順位が最も低い) スタイルシートに配置する必要があります。

于 2012-05-05T03:01:17.440 に答える