Ключ XSL с использованием нескольких значений - PullRequest
2 голосов
/ 26 августа 2011

Ниже приведен пример структуры 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' имеет видв форме «х: х», где х является числом.Для каждого портида мне нужно связать со значением <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 ]

1 голос
/ 26 августа 2011

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

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

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

0 голосов
/ 01 сентября 2011

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

...