Xslt 使用多个值的XSL键
以下是我正在研究的示例XML结构: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>
<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) > 0]" use="parameter[@index='2']"/>
<xsl:key name="port" match="command[@name='test'][count(add) > 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。我还为这个问题增加了更多的清晰度(我希望如此!)。我会等你的建议。再次感谢。