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 は数字です。ポート ID ごとに、値を関連付ける必要があり<parameter index="2">ます。<add>以前は、ノードの下に 1 つの portid 値しかなく、ソリューションは正常に機能していました。

ここで、値が「1:1」から「1:1」に、同様に「3:1」から「3:1」に変更されるように、XSL キー「ポート」の「use」式を変更する必要があります。 ' '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」です。

これは可能ですか?私はこれに1週間取り組んでいますが、まだ解決策を見つけることができません。どんな助けでも本当に感謝しています。どうもありがとう。

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 ではそれほど難しくありません。 ■ 文字列関数。

于 2011-08-26T16:48:00.403 に答える
0

XSL キーを使用しないことで、この問題の解決策を見つけることができました。代わりに、call-template メソッドを使用してカンマを削除し、シリーズを展開して、一致するものを見つけました。これについて私を助けてくれたすべての人に感謝します

于 2011-09-01T03:08:52.153 に答える