【问题标题】:java xsl template matchingjava xsl模板匹配
【发布时间】:2012-02-07 02:02:59
【问题描述】:

有谁知道 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 样式表中的模板匹配。

如果有人知道可以通过软件包等实现这一目标的好方法,我将不胜感激。谢谢

【问题讨论】:

    标签: java xml dom xslt


    【解决方案1】:

    效率不高,但您可以简单地在文档上运行 xpath 并查看它是否返回有问题的节点。

    【讨论】:

      【解决方案2】:

      Saxon 的 XPathCompiler 对象:

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

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

      【讨论】:

      • 这正是我想要的,不幸的是,它需要搬到撒克逊人,而这并不是真正的卡片
      【解决方案3】:

      使用

      //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]
           ] 
         ]
      

      请注意,节点被匹配模式匹配的事实并不意味着将选择模板来处理该节点(或者任何模板都将被选择) .处理模板的选择取决于现有的&lt;xsl:apply-templates&gt;,是否还有其他导入优先级或优先级更高的模板也匹配同一个节点。

      【讨论】:

        【解决方案4】:

        你需要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());
        

        【讨论】:

          猜你喜欢
          • 2011-03-08
          • 1970-01-01
          • 2016-04-25
          • 1970-01-01
          • 1970-01-01
          • 2019-02-11
          • 1970-01-01
          • 2013-02-28
          • 1970-01-01
          相关资源
          最近更新 更多