2011-11-13 9 views
1


現在、XMLからHTMLを生成するためにXSL-Transformationsを使用するプロジェクトに取り組んでいます。 入力フィールドには、設定する必要のある属性がいくつかあります。
サンプル:私は3回が...私の考えは、XSLファイルのためのポストプロセッサのいくつかの種類を持っていた同じXPathを記述する必要がありますので、私は書くことができますので、XSLのポストプロセスステップ

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

これはかなり愚かです:

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

私は私の希望は、私はDocumentオブジェクトのうち、Transformerオブジェクトを作成することができるということでした

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

私のXMLを変換するためにそのような何かを使用して使用しています。しかし、ファイルパスでなければならないようです。少なくとも、ドキュメントを直接使用する方法は見つけられません。
誰でも私が望むものを達成する方法を知っていますか?

おかげ

答えて

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変換として必要な変更を書き込むこともできます。

+0

includeはカスタムURIResolver(factory.setURIResolver(...))を実装することで解決できます。 – Daniel

2

なぜ後処理をスキップし、XSLTでこれを使用しない:

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

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

あなたが近づきます。

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

更新:

例コード:

<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モード用のテンプレートは、ウェブ上で利用可能です...たとえば、Schematronに付属している目的のテンプレートの1つを使用できます。 this pageに行き、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スタイルシート(すでに開発しているものをAと呼びます)を別のXSLTスタイルシートB)。 BがAを生成するとき、BはXPath式を引用符で囲まれた文字列として、評価される式として出力する機会があります。これは基本的に、Javaでの後処理ではなくXSLTでの前処理です。あなたのケースでうまくいくかどうかは分かりません。入力XMLがどのように見えるのか分かっていれば、私が考えていることを理解するのが簡単になります。

+0

はい名前はxpathでなければなりません。問題は、1つの属性がxslファイルを作成する人々によって綿糸になってしまうことです。私はエラーの可能性を可能な限り減らしたいと思っています。あなたは他のソリューションの例を教えてもらえますか(でも、コードは "普通の" htmlのようには見えないでしょうか?) – Daniel

+0

@Daniel、あなたの要求に答えて私の答えを更新しました。 – LarsH