2

以下是我正在处理的示例 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">值相关联。以前我们在节点下只有一个 portid 值,<add>并且解决方案运行良好。

现在,我需要更改 XSL 键“端口”中的“使用”表达式,以便将值从“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'。

这可能吗?我正在为此工作一周,但仍然无法找到解决方案。任何帮助将非常感激。非常感谢你们。

4

2 回答 2

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 来说应该不难s 字符串函数。

于 2011-08-26T16:48:00.403 回答
0

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

于 2011-09-01T03:08:52.153 回答