XSLの後処理ステップ

I’m currently working on a project which uses XSL-Transformations
to generate HTML from XML. On the input fields there are some
attributes I have to set.
Sample:

<input name="/my/xpath/to/node"
       class="{/my/xpath/to/node/@isValid}"
       value="{/my/xpath/to/node}" />

私は同じXPathを3回書く必要があるので、これはかなりばかげています…私の考えは、xslファイル用のポストプロセッサのようなものを用意して、書くことができます:

<input xpath="/my/xpath/to/node" />

私はxmlを変換するためにそのようなものを使用しています

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;

import org.dom4j.Document;
import org.dom4j.io.DocumentResult;
import org.dom4j.io.DocumentSource;

public class Foo {

    public Document styleDocument(
        Document document, 
        String stylesheet
    ) throws Exception {

       //load the transformer using JAXP
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer( 
            new StreamSource( stylesheet ) 
        );

       //now lets style the given document
        DocumentSource source = new DocumentSource( document );
        DocumentResult result = new DocumentResult();
        transformer.transform( source, result );

       //return the transformed document
        Document transformedDoc = result.getDocument();
        return transformedDoc;
    }
}

My hope was that I can create a Transformer object out of a
Document object. But it seems like it has to be a file path – at
least I can’t find a way to use a Document directly.
Anyone knows a way to achieve what I want?

Thanks

ベストアンサー

後処理をスキップして、XSLTでこれを使用してみましょう。



<input name="/my/xpath/to/node"
   class="{$myNode/@isValid}"
   value="{$myNode}" />

それはあなたを近づけます。

DRYを本当にしたい場合は、$ myNodeの値をテンプレートまたはユーザー定義関数を介して生成する変数
myNodePath を使用することもできます。名前は本当に
generate-id()とは対照的にXPath式でなければならないのでしょうか?

更新:

コード例:



  


<input name="{$myNodeName}"
   class="{$myNode/@isValid}"
   value="{$myNode}" />

generate-xpath モードのテンプレートは、Web上で利用できます。たとえば、
Schematron をご覧ください。 このページに行き、iso-schematron-xslt1.zipをダウンロードし、iso_schematron_skeleton_for_xslt1.xslを見てください。
(XSLT 2.0を使用できる場合は、そのzipアーカイブをダウンロードしてください)。

ここに generate-xpath に使用できる
schematron-select-full-path の実装がいくつかあります。
1つのバージョンは正確で、プログラムによる消費に最適です。もう1つは人間が読めるようになっています。
XML文書内の任意のノードに対して、そのノードだけを選択するために使用できる多数のXPath式があることに注意してください。だから、あなたはおそらく最初に入ったのと同じXPath式を得ることはできません。これがディール・ブレーカーの場合、次のような別のアプローチを試してみてください。

別のXSLTスタイルシート(Bと呼ぶ)でXSLTスタイルシート(すでに開発しているスタイルシートをAと呼ぶ)を生成します。
BがAを生成するとき、BはXPath式を引用符で囲まれた文字列として、評価される式として出力する機会があります。これは基本的に、Javaでの後処理ではなくXSLTでの前処理です。あなたのケースでうまくいくかどうかは分かりません。入力XMLがどのように見えるのか分かっていれば、私が考えていることを理解するのが簡単になります。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です