Java XSL шаблон соответствия - PullRequest
       23

Java XSL шаблон соответствия

1 голос
/ 10 января 2012

Кто-нибудь знает аккуратный способ в java или каких-либо пакетах, которые позволят мне проверить, будет ли узел в DOM соответствовать шаблону в таблице стилей 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 ]

1 голос
/ 10 января 2012

Саксонский объект XPathCompiler:

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

имеет метод compilePattern (), который позволяет вам скомпилировать шаблон XSLT. Это возвращается в форме XPathExecutable, который может быть оценен путем (a) предоставления целевого узла в качестве узла контекста для оценки и (b) вычисления выражения для возврата логического значения, которое является истинным, если шаблон соответствует узлу, или иначе false.

1 голос
/ 10 января 2012

Не очень эффективно, но вы можете просто запустить xpath для документа и посмотреть, возвращает ли он рассматриваемый узел.

0 голосов
/ 11 января 2012

Является ли Java 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());
0 голосов
/ 11 января 2012

Используйте

//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>, от того, существуют ли другие шаблоны с более высоким приоритетом импорта или приоритетом, которые также соответствуют тому же узлу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...