如何使用可变条件(从以前的XML节点提取)将XSLT模板应用于节点副本
我不熟悉XSLT转换。我正在编写一些转换来重构用srcML表示的代码,我面临一个问题。我正在使用的XML输入如下所示:如何使用可变条件(从以前的XML节点提取)将XSLT模板应用于节点副本,xml,xslt,xpath,Xml,Xslt,Xpath,我不熟悉XSLT转换。我正在编写一些转换来重构用srcML表示的代码,我面临一个问题。我正在使用的XML输入如下所示: 。。。。 水平抽气 ( 张纸, int x, int(y) {..... P [x] [y] . 霍 = 1 ; ... } 我想做的是,对于每个功能部分: 1) 识别某一类型参数的名称(例如t_paper类型的p) 2) 更改找到上一步中标识的参数的表达式语句() 输出应如下所示: 。。。。。 水平抽气 ( 张纸, int x, int(y) {..... P 数据 [x
。。。。
水平抽气
(
张纸,
int x,
int(y)
{.....
P
[x]
[y]
.
霍
= 1
;
...
}
我想做的是,对于每个功能部分:
1) 识别某一类型参数的名称(例如t_paper类型的p)
2) 更改找到上一步中标识的参数的表达式语句()
输出应如下所示:
。。。。。
水平抽气
(
张纸,
int x,
int(y)
{.....
P
数据
[x]
[y]
.
霍
= 1
;
...
}
总之,我只需要在找到某种类型的参数的地方转换expr_stmt节点(示例中的t_paper)。文件的其余部分应按原样复制
我的问题是,我无法根据动态创建的条件(参数名称)将模板应用于特定的部分
一些不工作的代码如下所示:
此处替换
如果有人能给我一个提示,我将不胜感激
请让我知道,如果你需要更多的细节,因为这是我在SO的第一个问题
干杯
这是一个xsl:key-element/key()函数的答案 为了找到一个可行的答案,我不得不从你的两步解决方案中退一步。我不知道你的表达式语句是从哪里来的,但我想它是从C#/.NET来的 在任何情况下,我看到您所做的是包装一个类型,以便表达式从:
p[x][y] to p.data[x][y]
如果是这样的话,我没有对整个函数应用不同的外观,而是选择在表达式的组件上匹配模板。然后有条件地在每个参数名上查找类型,看看它是否就是您要查找的类型。可以为要捕获的每种类型添加其他“when”语句:
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<!-- key('parambyname','p')/type/name eq 't_paper' -->
<xsl:key name="parambyname" match="parameter_list/param/decl" use="name"/>
<xsl:template match="//expr_stmt/expr//name">
<xsl:choose>
<xsl:when test="key('parambyname',text())/type/name eq 't_paper'">
<xsl:copy>
<xsl:apply-templates select="./text()" />
</xsl:copy>
<xsl:text>.</xsl:text>
<name>data</name>
<xsl:apply-templates select="!text()"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
.
数据
此简单转换(完全没有显式条件):
数据
应用于提供的XML文档时:
<function>
<type>
<name>void</name>
</type>
<name>DrawHorizontal</name>
<parameter_list>(
<param>
<decl>
<type>
<name>t_paper</name>
</type>
<name>p</name>
</decl>
</param>,
<param>
<decl>
<type>
<name>int</name>
</type>
<name>x</name>
</decl>
</param>,
<param>
<decl>
<type>
<name>int</name>
</type>
<name>y</name>
</decl>
</param>)
</parameter_list>
<block>{.....
<expr_stmt>
<expr>
<name>
<name>p</name>
<index>[
<expr>
<name>x</name>
</expr>]
</index>
<index>[
<expr>
<name>y</name>
</expr>]
</index></name>.
<name>hor</name>
<operator>=</operator> 1
</expr>;
</expr_stmt> ... }
</block>
</function>
<function>
<type>
<name>void</name>
</type>
<name>DrawHorizontal</name>
<parameter_list>(
<param>
<decl>
<type>
<name>t_paper</name>
</type>
<name>p</name>
</decl>
</param>,
<param>
<decl>
<type>
<name>int</name>
</type>
<name>x</name>
</decl>
</param>,
<param>
<decl>
<type>
<name>int</name>
</type>
<name>y</name>
</decl>
</param>)
</parameter_list>
<block>{.....
<expr_stmt>
<expr>
<name>p</name>
<name>
<name>data</name>
<index>[
<expr>
<name>x</name>
</expr>]
</index>
<index>[
<expr>
<name>y</name>
</expr>]
</index>
</name>.
<name>hor</name>
<operator>=</operator> 1
</expr>;
</expr_stmt> ... }
</block>
</function>
无效的
拉平
(
铜版纸
P
,
int
x
,
int
Y
)
{.....
P
[
x
]
[
Y
]
.
霍
= 1
;
... }
产生想要的结果:
<function>
<type>
<name>void</name>
</type>
<name>DrawHorizontal</name>
<parameter_list>(
<param>
<decl>
<type>
<name>t_paper</name>
</type>
<name>p</name>
</decl>
</param>,
<param>
<decl>
<type>
<name>int</name>
</type>
<name>x</name>
</decl>
</param>,
<param>
<decl>
<type>
<name>int</name>
</type>
<name>y</name>
</decl>
</param>)
</parameter_list>
<block>{.....
<expr_stmt>
<expr>
<name>
<name>p</name>
<index>[
<expr>
<name>x</name>
</expr>]
</index>
<index>[
<expr>
<name>y</name>
</expr>]
</index></name>.
<name>hor</name>
<operator>=</operator> 1
</expr>;
</expr_stmt> ... }
</block>
</function>
<function>
<type>
<name>void</name>
</type>
<name>DrawHorizontal</name>
<parameter_list>(
<param>
<decl>
<type>
<name>t_paper</name>
</type>
<name>p</name>
</decl>
</param>,
<param>
<decl>
<type>
<name>int</name>
</type>
<name>x</name>
</decl>
</param>,
<param>
<decl>
<type>
<name>int</name>
</type>
<name>y</name>
</decl>
</param>)
</parameter_list>
<block>{.....
<expr_stmt>
<expr>
<name>p</name>
<name>
<name>data</name>
<index>[
<expr>
<name>x</name>
</expr>]
</index>
<index>[
<expr>
<name>y</name>
</expr>]
</index>
</name>.
<name>hor</name>
<operator>=</operator> 1
</expr>;
</expr_stmt> ... }
</block>
</function>
无效的
拉平
(
铜版纸
P
,
int
x
,
int
Y
)
{.....
P
数据
[
x
]
[
Y
]
.
霍
= 1
;
... }
说明:
<function>
<type>
<name>void</name>
</type>
<name>DrawHorizontal</name>
<parameter_list>(
<param>
<decl>
<type>
<name>t_paper</name>
</type>
<name>p</name>
</decl>
</param>,
<param>
<decl>
<type>
<name>int</name>
</type>
<name>x</name>
</decl>
</param>,
<param>
<decl>
<type>
<name>int</name>
</type>
<name>y</name>
</decl>
</param>)
</parameter_list>
<block>{.....
<expr_stmt>
<expr>
<name>
<name>p</name>
<index>[
<expr>
<name>x</name>
</expr>]
</index>
<index>[
<expr>
<name>y</name>
</expr>]
</index></name>.
<name>hor</name>
<operator>=</operator> 1
</expr>;
</expr_stmt> ... }
</block>
</function>
<function>
<type>
<name>void</name>
</type>
<name>DrawHorizontal</name>
<parameter_list>(
<param>
<decl>
<type>
<name>t_paper</name>
</type>
<name>p</name>
</decl>
</param>,
<param>
<decl>
<type>
<name>int</name>
</type>
<name>x</name>
</decl>
</param>,
<param>
<decl>
<type>
<name>int</name>
</type>
<name>y</name>
</decl>
</param>)
</parameter_list>
<block>{.....
<expr_stmt>
<expr>
<name>p</name>
<name>
<name>data</name>
<index>[
<expr>
<name>x</name>
</expr>]
</index>
<index>[
<expr>
<name>y</name>
</expr>]
</index>
</name>.
<name>hor</name>
<operator>=</operator> 1
</expr>;
</expr_stmt> ... }
</block>
</function>
我确信它可以工作,但是您发布的输出XML中没有.data;)@memetech:谢谢你通知我——我甚至没有注意到
数据。现在添加。非常感谢Dimitre,回答得很好。它工作得很好,我不知道钥匙的存在。我真的很感激。大家好,一切正常,但现在我在key()函数中尝试使用输入参数(使用xsltproc--stringparam type“t_paper”…)时出现编译错误,如下所示:key('nameofkey',$type)。错误是:xsltCompilePattern:未能编译'key('nameofkey',$type')有什么想法吗?好的,问题解决了。当然,这是因为xslt 1.0不允许在匹配表达式中使用变量@@memetech:这段代码不符合xslt(1.0或2.0)。请在发布之前运行您的解决方案(如有必要,请更正)。我还做了一个明显的更正,然后运行它,结果发现生成的输出不是想要的。在发布之前,我使用WMHelp的XMLPad 3.0开发并运行了该解决方案。我再次验证了它与MSXML30、MSXML40或它自己的内部转换引擎没有问题。没有验证错误。如果它在XSLT规范中有问题,那么它显然是USL