我试图在匹配中实现一种通配符机制,以便在XSLT模板中使用 .
我最初的问题是我在一组文件中寻找java代码行 . 我正在寻找的线路可能是这样的:
a.setValue(2);
System.out.println(a.toString());
a.getValue();
在这一行中, a
不是确切的变量名,而是一种占位符 . 我正在寻找三个java代码行,其中以这种方式使用相同的变量 .
为了实现我的目标,我想到了使用XSLT,因为有了它我想解释这种概念 .
用srcml我在xml中翻译了java代码,这是我需要查找java代码行的xml表 .
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<unit filename="Users/bibi/Documents/UniMi/CloudStation/TesiM/DSL/DSL/resources/src/src_beautified/strategy/StrategyExample.java" language="Java" revision="0.9.5" xmlns="http://www.srcML.org/srcML/src">
<package>package
<name>strategy</name>
;</package>
<import>import
<name>
<name>strategy</name>
<operator>.</operator>
<name>strategy</name>
<operator>.</operator>
<name>HelloWorld</name></name>;</import>
<import>import
<name>
<name>strategy</name>
<operator>.</operator>
<name>strategy</name>
<operator>.</operator>
<name>SubArray</name></name>;</import>
<class>
<specifier>public</specifier>class
<name>StrategyExample</name>
<block>
{
<function>
<specifier>public</specifier>
<specifier>static</specifier>
<type>
<name>void</name></type>
<name>main</name>
<parameter_list>(
<parameter>
<decl>
<type>
<name>
<name>String</name>
<index>[]</index></name>
</type>
<name>args</name>
</decl>
</parameter>)</parameter_list>
<block>{
<decl_stmt>
<decl>
<type>
<name>MyArray</name></type>
<name>m</name>
<init>=
<expr>
<operator>new</operator>
<call>
<name>MyArray</name>
<argument_list>
(
<argument>
<expr>
<literal type="number">10</literal></expr>
</argument>)</argument_list>
</call>
</expr>
</init>
</decl>;</decl_stmt>
<decl_stmt>
<decl>
<type>
<name>HelloWorld</name>
</type>
<name>hw</name>
<init>=
<expr>
<operator>new</operator>
<call>
<name>HelloWorld</name>
<argument_list>()</argument_list></call>
</expr>
</init>
</decl>;</decl_stmt>
<expr_stmt>
<expr>
<call>
<name>
<name>System</name>
<operator>.</operator>
<name>out</name>
<operator>.</operator>
<name>println</name>
</name>
<argument_list>(
<argument>
<expr>
<call>
<name>
<name>hw</name>
<operator>.</operator>
<name>getString</name></name>
<argument_list>(
<argument>
<expr>
<literal type="string">"prova"</literal></expr>
</argument>)</argument_list>
</call>
<operator>.</operator>
<call>
<name>substring</name>
<argument_list>(
<argument>
<expr>
<literal type="number">0</literal></expr>
</argument>,
<argument>
<expr>
<literal type="number">3</literal></expr>
</argument>)</argument_list>
</call>
</expr>
</argument>)</argument_list>
</call>
</expr>;</expr_stmt>
<expr_stmt>
<expr>
<call>
<name>
<name>m</name>
<operator>.</operator>
<name>setValue</name>
</name>
<argument_list>(
<argument>
<expr>
<literal type="number">1</literal></expr>
</argument>,
<argument>
<expr>
<literal type="number">6</literal></expr>
</argument>)</argument_list>
</call>
</expr>;</expr_stmt>
<expr_stmt>
<expr>
<call>
<name>
<name>m</name>
<operator>.</operator>
<name>setValue</name>
</name>
<argument_list>(
<argument>
<expr>
<literal type="number">0</literal></expr>
</argument>,
<argument>
<expr>
<literal type="number">8</literal></expr>
</argument>)</argument_list>
</call>
</expr>;</expr_stmt>
<expr_stmt>
<expr>
<call>
<name>
<name>hw</name>
<operator>.</operator>
<name>getString</name>
</name>
<argument_list>(
<argument>
<expr>
<operator>new</operator>
<call>
<name>String</name>
<argument_list>
(
<argument>
<expr>
<literal type="string">"ciao"</literal></expr>
</argument>)</argument_list>
</call>
</expr>
</argument>)</argument_list>
</call>
</expr>;</expr_stmt>
}</block>
</function>}</block>
</class>
在这个例子中,我想寻找这两行:
m.setValue( 1 , 6 );
m.setValue( 0 , 8 );
我为了捕获这一行而生成的xslt模板中使用的xpath匹配是这样的:
src:expr_stmt
[src:expr[src:call[src:name[src:operator='.'][src:name='setValue']]
[src:argument_list
[src:argument[src:expr[src:literal='1'][src:literal[contains(@type, 'number')]]]]
[src:argument[src:expr[src:literal='6'][src:literal[contains(@type, 'number')]]]]]]]
[following-sibling::*[2][self::src:expr_stmt
[src:expr[src:call[src:name[src:name[matches(@name, preceding-sibling::*[2]/@src_expr/src_call/src_name/src:name)]
[src:operator='.'][src:name='setValue']]
[src:argument_list[src:argument[src:expr[src:literal='0'][src:literal[contains(@type, 'number')]]]]
[src:argument[src:expr[src:literal='8'][src:literal[contains(@type, 'number')]]]]]]]]]]
但它无法正常工作,因为它选择了所有 src:expr_stmt
节点 .
有谁能够帮我?
2 回答
如果我现在正确理解你的要求,我认为密钥有助于解决这个问题 . 这是你提供的后一个例子的XSLT(带有两个
.setValue
):在示例XML上运行时,输出为:
我不确定我是否已经理解了这个问题,我认为如果你发布了一个简化的输入样本会更好,但我不能真正尝试将问题讨论成评论我将这个分组建议作为讨论贡献发布:
当我针对发布的输入样本运行此操作时,我会添加一些结束标记
这至少看起来是解决问题的一步吗?可能是那些了解复杂输入格式的人可以进一步调整XPath或分组,但也许建议显示如何提取和分组格式中的某些元素 .
比如说
我们只得到
要么
会给