Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 使用多个值的XSL键_Xslt_Xslkey - Fatal编程技术网

Xslt 使用多个值的XSL键

Xslt 使用多个值的XSL键,xslt,xslkey,Xslt,Xslkey,以下是我正在研究的示例XML结构: <command name="test"> <parameter index="2">4000</parameter> <tag>4000</tag> <parameter index="3">tag</parameter> <parameter index="4">4000</parameter>

以下是我正在研究的示例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>

4000
4000
标签
4000
4000
港口
1:1,
3:1,
3:9-12,
4:12
添加
港口
1:1,
3:1,
3:9-12,
4:12
标记的
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>

XYZ
XYZ1
变量“portid”的形式为“x:x”,其中x是一个数字。对于每个portid,我需要与
值关联。以前,我们在
节点下只有一个portid值,解决方案运行良好

现在,我需要更改XSL键“port”中的“use”表达式,以便将值从“1:1”更改为“1:1”,类似地从“3:1”更改为“3:1”,并将“3:9-12”扩展为“3:9”、“3:10”、“3:11”、“3:12”,并将它们与值一起存储在
中。例如,每次“portid”是“1:1”、“3:1”、“3:9”、“3:10”、“3:11”、“3:12”和“4:12”中的任意一个时,要关联的值都是“4000”


这可能吗?我在这方面工作了一个星期,仍然无法找到解决方案。任何帮助都将不胜感激。非常感谢各位。

我认为只有使用XSLT 2.0,例如

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


对于简单的替换就可以了,对于更复杂的替换,您可能必须使用
xsl:function
编写一个函数,该函数接受例如“3:9-12”,并返回您想要的序列,这对于XPath 2.0的字符串函数来说应该不难。

我能够通过不使用xsl键找到这个问题的解决方案。相反,我使用了一个调用模板方法来去掉逗号,展开序列并找到匹配项。感谢所有愿意在这方面帮助我的人

您能够使用XSLT 2.0吗?如果不是,我们可以建议1.0的解决方案,但它不是很漂亮。请提供想要的结果并描述分组所需的规则,好吗?这到目前为止还不清楚。@LarsH:我只能使用XSLT1.0。谢谢你的帮助。@Dimitre Novatchev:如果我的问题不够清楚,我很抱歉。我对原始问题进行了编辑,以便更详细地了解问题。非常感谢你抽出时间帮我解答这个问题。不幸的是,我们只能使用XSLT1.0。我还为这个问题增加了更多的清晰度(我希望如此!)。我会等你的建议。再次感谢。