2

以前にいくつかのテンプレートを使用して作成した既存の xslt ファイルがあります。

現在、要件が変更されており、これらの特定のテンプレートの 1 つを処理する前に、現在評価中のノードに特定の属性があるかどうかを確認する必要があります。

はいの場合、別のテンプレートを最初に呼び出し、次に特定のテンプレートを呼び出す必要があります。

したがって、基本的に私の入力 XML は次のようになります。

<baseNode>
    <textGroup>
        <title>Title here</title>
        <text specAttr="id123456">Text here</text>
        <text>Another text</text>
    </textGroup>
    <paragraph specAttr="id123456">Other text here</paragraph>
    <references>
        <reference specAttr="id123456">
            <data title="1st Reference" ref="http://..." />
        </reference>
        <reference>
            <data title="2nd Reference" ref="http://..." />
        </reference>
        <reference specAttr="id123456">
            <data title="3rd Reference" ref="http://..." />
        </reference>
    </references>
</baseNode>

XML ファイルを解析すると、結果は次のようになります (実際には、Apache FOP 経由で PDF を作成したいので、結果には FO タグが含まれています。これは、やりたいことを単純化するためです)。

<base>
    <title>Title here</title>
    <text>Next text has this attribute</text>
    <text>Text here</text>
    <text>Another text</text>
    <text>Next text has this attribute</text>
    <p>Other text here</p>
    <table>
        <head>
            <row>
                <cell>Title</cell>
                <cell>URL</cell>
            </row>
        </head>
        <body>
            <row>
                <cell col-span="2">
                    <text>Next text has this attribute</text>
                </cell>
            </row>
            <row>
                <cell>1st Reference</cell>
                <cell>http://...</cell>
            </row>
            <row>
                <cell>2nd Reference</cell>
                <cell>http://...</cell>
            </row>
            <row>
                <cell col-span="2">
                    <text>Next text has this attribute</text>
                </cell>
            </row>
            <row>
                <cell>3rd Reference</cell>
                <cell>http://...</cell>
            </row>
        </body>
    </table>
</base>

ええと... XML にはこの属性 ' ' を持つことができる要素がいくつかありますが、この属性をチェックするためにspecAttr既存の各要素を変更したくありません...<xsl:template>

<xsl:template match="*">その仕事をしたを追加しようとしましたが、この要素の特定のテンプレートが処理される前に、各要素に一致することを望みました。xsl:templateしかし、これは特定の定義されていないノードに対してのみ機能するようです。

で属性に一致するテンプレートを作成できることもここで既に読みました<xsl:template match="@specAttr">が、このテンプレートは追加した場合にのみ解析され<xsl:apply-templates select="@*"/>ます。したがって、既存の各テンプレートを変更して、この行を追加する必要もあります。

テンプレート階層やテンプレート間の継承のようなものを作成することは可能ですか? 現在のノードの実際のテンプレートの前に常に親テンプレートが処理されるということですか?

編集:reference要素を見ると、新しいテンプレートを処理する必要がある場所を時々知る必要があることがわかります... a にこの属性がある場合、reference列スパンが 2 の完全な新しい行を作成する必要があります (ただし、ノードを追加するだけtextでは十分ではないため、4) になる可能性のある別のテーブルにある場合もあります...

これについて考えると、これを行う一般的な方法を見つける方法はないと思います...

または、誰か別の賢いアイデアがありますか?

さらに詳しい情報が必要な場合やご質問がある場合は、お気軽にお問い合わせください。

前もって感謝します。

BRgrds、イェンス

4

1 に答える 1

0

ここでは、xsl:next-match 命令が役立ちます (XSLT 1.0 を使用している場合は、xsl:apply-imports)。これにより、次のようなことができます

<xsl:template match="*[@specAttr]" priority="20">
  <doSomethingSpecial>
    <xsl:next-match/>
  </doSomethingSpecial>
</xsl:template>

ここで、next-match 命令は既存のルールを呼び出します。これがなければ一致したであろうルール。(apply-imports は少し異なります。2 番目のルールはインポートされたスタイルシートにある必要があります)。

オーバーライドされたテンプレート ルールによって作成された出力の途中に何かを挿入する必要がある場合、これはうまく機能しません。しかし、それを行う必要があるかどうかは、問題のステートメントからは明らかではありません。その場合、オーバーライドするテンプレート ルールでオーバーライドされたテンプレート ルールの出力を変数にキャプチャし、変数の内容を変換することで実現できる場合があります。

于 2014-08-06T11:39:55.330 に答える