有没有人知道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样式表中用作模板匹配。
如果有人知道这可以通过包等获得好的方式,我将不胜感激。谢谢
答案 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());