2012-01-10 12 views
1

DOM内のノードがxslスタイルシートのテンプレート上で一致するかどうかを確認できるように、Javaやパッケージできちんとした方法を知っている人はいますか?java xslテンプレートのマッチング

たとえば、

<xsl:template match="elem/child/item"> 
    ... 
</xsl:template> 

テンプレートになると思います。使用パターンは、XSLスタイルシート内のテンプレート一致として使用できるXPath式の任意の種類とすることができる。もちろん

Node n = getNode(); 
String pattern = "elem/child/item" 
boolean match = PatternMatcher.isMatch(n, pattern); 

誰もが、これはその他のパッケージを通じてacheivedすることができ良い方法を知っていれば、私は感謝

答えて

1

サクソンのXPathCompilerオブジェクト:

http://www.saxonica.com/documentation/javadoc/net/sf/saxon/s9api/XPathCompiler.html

を使用すると、XSLTパターンをコンパイルすることを可能にする方法のcompilePattern()を持っています。これはXPathExecutableの形で返されます。これは、(a)ターゲットノードを評価のためのコンテキストノードとして提供し、(b)パターンがノードに一致する場合は真であるブール値を返すように式を評価するか、そうでなければfalse。

+0

これは、残念ながらそれはカードに実際にされていないサクソンへの移動が必要になり、私が望んでいたまさにです – mpc

1

超効率的ではない、それを大幅に感謝していますが、単に文書でXPathを実行し、それが中にノードを返すかどうかを確認できました質問。

0

使用

//elem/child/item 

これはマッチパターンelem/child/itemで一致しているXML文書の正確すべてのノードを選択します。

このXPath式を使用、所与のノード$ nはテンプレートにマッチしていることを確認する:あるいは(これは、より効率的であってもよい)

count($n | //elem/child/item) = count(//elem/child/item) 

を:

$n[self::item 
and 
    parent::node() 
    [self::child 
    and 
     parent::node() 
     [self::elem] 
    ] 
    ] 

ノートを実行すると、ノードが一致パターンと一致するという事実は、このノードを処理するためにテンプレートが選択されることを意味しない(または、テンプレートが全く選択されない)ことを意味する。処理のためのテンプレートの選択は、既存の<xsl:apply-templates>に依存します。インポートの優先順位が高い、または優先順位が同じ、同じノードにも一致する他のテンプレートがあるかどうかによって異なります。

0

Java's XPath APIは必要ですか?

InputSource source = new InputSource(new FileInputStream("myfile.xml")); 
//Document source = ...; //or use a DOM document as the source 

String expression = "//elem/child/item"; //XPath expression 

XPath xPath = XPathFactory.newInstance().newXPath(); 
NodeList matches = (NodeList)xPath.evaluate(expression, source, XPathConstants.NODESET); 
System.out.println("Match count: " + matches.getLength()); 
関連する問題