Ключ XSL с использованием нескольких значений

Ниже приведен пример структуры 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 - это число. Для каждого портида мне нужно связать с <parameter index="2"> значение. Ранее у нас было только одно значение portid под <add> узел и решение работало нормально.

Теперь мне нужно изменить выражение "use" в ключе XSL "port", чтобы значения были изменены с "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 ответа

Решение

Я смог найти решение этой проблемы, не используя ключ XSL. Вместо этого я использовал метод call-template, чтобы убрать запятые, расширить серию и найти совпадение. Спасибо всем, кто помог мне в этом

Я думаю, что вы можете сделать это только с XSLT 2.0, например

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

для простой замены, для более сложной вам, вероятно, придется написать функцию с xsl:function например, "3:9-12" и возвращает нужную вам последовательность, что не должно быть затруднительно при работе со строковыми функциями XPath 2.0.

Другие вопросы по тегам