如何使用可变条件(从以前的XML节点提取)将XSLT模板应用于节点副本

如何使用可变条件(从以前的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

我不熟悉XSLT转换。我正在编写一些转换来重构用srcML表示的代码,我面临一个问题。我正在使用的XML输入如下所示:

。。。。
水平抽气
(
张纸,
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