以下是我正在研究的示例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) > 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>
变量'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'。
这可能吗?我正在研究这个问题一个星期,但仍无法找到解决方案。任何帮助将非常感激。非常感谢你们。
答案 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密钥找到解决此问题的方法。相反,我使用调用模板方法去除逗号并展开系列并找到匹配项。感谢所有在此帮助我的人