java xsl模板匹配

时间:2012-01-10 16:46:13

标签: java xml dom xslt

有没有人知道java或任何软件包中的一种简洁方法,可以让我检查DOM中的Node是否与xsl样式表中的模板匹配。

例如;

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

这将是一个模板,我正在寻找匹配使用类似的东西;

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

当然,使用的模式可以是任何类型的XPath表达式,可以在xsl样式表中用作模板匹配。

如果有人知道这可以通过包等获得好的方式,我将不胜感激。谢谢

4 个答案:

答案 0 :(得分:1)

效率不高,但您只需在文档上运行xpath,看看它是否返回相关节点。

答案 1 :(得分:1)

Saxon的XPathCompiler对象:

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

有一个方法compilePattern(),允许您编译XSLT模式。这是以XPathExecutable的形式返回的,可以通过(a)提供目标节点作为评估的上下文节点来评估,以及(b)评估表达式以返回布尔值,如果模式匹配节点或否则就是假的。

答案 2 :(得分:0)

使用

//elem/child/item

这将精确选择XML文档中匹配模式匹配的所有节点 elem/child/item

要验证模板是否匹配给定节点$ n,请使用此XPath表达式:

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>,是否有其他模板具有更高的导入优先级或优先级也与同一节点匹配。

答案 3 :(得分: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());