XSL键使用多个值

时间:2011-08-26 16:02:33

标签: xslt xslkey

以下是我正在研究的示例XML结构:

<command name="test">
      <parameter index="2">4000</parameter>
      <tag>4000</tag>
      <parameter index="3">tag</parameter>
      <parameter index="4">4000</parameter>
    </command>

<command name="test">
  <parameter index="2">4000</parameter>
  <add>
    <parameter index="1">ports</parameter>
    <parameter index="2">1:1,</parameter>
    <parameter index="3">3:1,</parameter>
    <parameter index="4">3:9-12,</parameter>
    <parameter index="5">4:12</parameter>
  </add>
  <parameter index="3">add</parameter>
  <parameter index="4">ports</parameter>
  <parameter index="5">1:1,</parameter>
  <parameter index="6">3:1,</parameter>
  <parameter index="7">3:9-12,</parameter>
  <parameter index="8">4:12</parameter>
  <tagged />
  <parameter index="9">tagged</parameter>
</command>

XSL文件上的代码片段为:

 <xsl:key name="key" match="command[@name='test'][count(tag) &gt; 0]" use="parameter[@index='2']"/>
    <xsl:key name="port" match="command[@name='test'][count(add) &gt; 0]" use="add/parameter"/>

<xsl:template match="xyz">
<xsl:variable name="portid" select="concat($slot-no,concat(':',$port-no))"/>
<xsl:apply-templates select="key('port',$portid)"/>
</xsl:template>

<xsl:template match="command[@name='test']">
         <xsl:variable name="name" select="parameter[@index=2]"/>
         <object>
         <name><xsl:value-of select="$name"/></name>
                  <class>XYZ</class>
            <attributes>
               <attribute>
                  <name>XYZ1</name>
                  <value><xsl:value-of select="key('key',$name)/tag"/></value>
               </attribute>
            </attributes>
         </object>
</xsl:template>

变量'portid'的形式为'x:x',其中x是数字。对于每个portid,我需要与<parameter index="2">值相关联。以前我们在<add>节点下只有一个portid值,解决方案运行正常。

现在,我需要更改XSL键'port'中的'use'表达式,以便将值从'1:1'更改为'1:1'并类似地将'3:1'更改为' 3:1'并将'3:9-12'扩展为'3:9','3:10','3:11','3:12'并将其存储为<parameter index="2">中的值。例如,每次'portid'是'1:1','3:1','3:9','3:10','3:11','3:12'中的任何一个, '4:12',关联的价值是'4000'。

这可能吗?我正在研究这个问题一个星期,但仍无法找到解决方案。任何帮助将非常感激。非常感谢你们。

2 个答案:

答案 0 :(得分:1)

我认为你只能用XSLT 2.0干净地做到这一点,例如

<xsl:key name="port" match="command[@name='test'][add]" use="add/parameter/replace(., ',', '')"/>

将替换为简单替换,对于更复杂的替换,您可能需要编写xsl:function的函数,例如'3:9-12,'并返回你想要的序列,这对于XPath 2.0的字符串函数来说应该不会很难。

答案 1 :(得分:0)

我能够通过不使用XSL密钥找到解决此问题的方法。相反,我使用调用模板方法去除逗号并展开系列并找到匹配项。感谢所有在此帮助我的人