1


現在、XSL 変換を使用して XML から HTML を生成するプロジェクトに取り組んでいます。入力フィールドには、設定しなければならない属性がいくつかあります。
サンプル:

<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;
    }
}

私の希望は、Document オブジェクトから Transformer オブジェクトを作成できることでした。しかし、それはファイル パスでなければならないようです。少なくとも、ドキュメントを直接使用する方法が見つかりません。
私が望むものを達成する方法を知っている人はいますか?

ありがとう

4

2 に答える 2

2

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

<xsl:variable name="myNode" select="/my/xpath/to/node" />

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

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

本当にDRYしたい場合は(明らかにそうしますが)、myNodePathテンプレートまたはユーザー定義関数を介して$myNodeから値を生成する変数を使用することもできます。名前は本当にXPath式である必要がありますか(generate-id()?ではなく)

アップデート:

コード例:

<xsl:variable name="myNode" select="/my/xpath/to/node" />
<xsl:variable name="myNodeName">
  <xsl:apply-template mode="generate-xpath" select="$myNode" />
</xsl:variable>

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

モードのテンプレートgenerate-xpathはWebで入手できます...たとえば、Schematronに付属しているその目的のためにテンプレートの1つを使用できます。このページに移動し、iso-schematron-xslt1.zipをダウンロードして、iso_schematron_skeleton_for_xslt1.xslを確認します。(XSLT 2.0を使用できる場合は、そのzipアーカイブをダウンロードしてください。)

schematron-select-full-pathそこには、に使用できるの実装がいくつかありますgenerate-xpath。1つのバージョンは正確であり、プログラムでの使用に最適です。もう1つは、より人間が読める形式です。XMLドキュメント内の特定のノードには、そのノードのみを選択するために使用できる多数のXPath式があることを忘れないでください。したがって、最初に使用したのと同じXPath式を取得できない可能性があります。これが取引を妨げるものである場合は、次のような別のアプローチを試してみてください...

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

于 2011-11-13T12:37:43.957 に答える
0

私の望みは、DocumentオブジェクトからTransformerオブジェクトを作成できることでした。しかし、それはファイルパスでなければならないようです-少なくとも、ドキュメントを直接使用する方法を見つけることができません。

ドキュメントオブジェクトからTransformerオブジェクトを作成できます。

    Document stylesheetDoc = loadStylesheetDoc(stylesheet);
    // load the transformer using JAXP
    TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer( 
        new DOMSource( stylesheetDoc ) 
    );

実装loadStylesheetDocは演習として残されています。スタイルシートを内部で構築するDocumentことも、jaxpを使用してロードすることもできます。また、スタイルシートを変換する別のXSLT変換として、必要な変更を書き込むこともできます。

于 2011-11-13T13:15:11.993 に答える