Присвоение переменной значению, выбранному в цикле в xslt

То, что я здесь делаю, работает - мне просто интересно, есть ли лучший или более эффективный способ сделать то же самое.

Вот структура XML

<tags>
     <tag>
          <val1>abc</val1>
          <val2>123</val2>
     </tag>
        <tag>
          <val1>def</val1>
          <val2>456</val2>
     </tag>
     <tag>
          <val1>ghi</val1>
          <val2>789</val2>
     </tag>
</tags>

Мне нужно присвоить переменную значению val2, но ТОЛЬКО если val1 = 'def' Так что в конце я хочу переменную, которая будет равна значению 456

Гарантируется, что эти значения будут уникальными, поэтому def будет существовать только один раз.

Я решил это, присвоив переменную значению в цикле, проверяя, какое значение я ищу

<xsl:variable name="id">
     <xsl:for-each select="tags/tag">
          <xsl:variable name="role"><xsl:value-of select="val1"/ </xsl:variable>
          <xsl:if test="$role = 'def'">
               <xsl:value-of select="val2"/>
          </xsl:if>
      </xsl:for-each>
 </xsl:variable>

Это решение работает и правильно присваивает значение 456 переменной 'id', но оно немного медленное, поэтому мне было интересно, есть ли альтернативные решения, о которых я, возможно, не думаю.

1 ответ

Решение

Вы можете просто выбрать элемент с <xsl:variable name="id" select="tags/tag[val1 = 'def']/val2"/> или определить ключ <xsl:key name="val2-by-val1" match="tags/tag/val2" use="../val1"/> а затем выберите <xsl:variable name="id" select="key('val2-by-val1', 'def')"/>,

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