0

次のように動作するカスタム関数/要素を作成する方法があるかどうか疑問に思っています<xsl:for-each/>

function/elementを登録する方法があることは知っていますが、(私の知る限り) コンテキストを変更して内部 XSLT 命令を再帰的に実行することはできません。

たとえば、私が達成したいのはこれです:

<myxsl:change-context name='x'>
  <xsl:value-of select='name()'/>
</myxsl:change-context>
4

2 に答える 2

0

@nwellnholfのアドバイスに基づいて、transform.cをチェックし、しばらくして実装方法を見つけました。

xsltApplySequenceConstructor@nwellnholf が書いたように、核となる魔法は内部にあります。本来この関数は transform.c でのみ定義されているため、使用するにはライブラリを編集してこの関数を公開する必要があります。これを行うには、これを transform.h で定義し、libxslt を再コンパイルします。

XSLTPUBFUN void xsltApplySequenceConstructor(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, xmlNodePtr list, xsltTemplatePtr templ);

2 番目のステップは、独自の xslt 関数を実装し、独自の命令を進め、処理を xslt に戻すことです。これらの手順は、次のコマンドを使用して実行されます。

void elemChangeContext(xsltTransformContextPtr ctxt, xmlNodePtr node, xmlNodePtr inst, xsltElemPreCompPtr /*comp*/)
{
    if ( ctxt == NULL || node == NULL || inst == NULL || ctxt->insert == NULL )
        return;

    xmlNodePtr cur = /* change context to different node */;
    xmlNodePtr curInst = inst->children; //sub xslt instruction
    xsltApplySequenceConstructor(ctxt,cur, curInst,NULL);
}
于 2015-04-03T20:23:08.193 に答える