Как извлечь определенное значение из повторяющегося узла

#xslt

#xslt

Вопрос:

Люди: Пожалуйста, извините за этот вопрос новичка, но, пожалуйста, помогите мне —

Я использую XSL для манипулирования некоторыми значениями в XML, который выглядит следующим образом —

 <userFields>
<userField>
   <FieldName>TEST1</FieldName>
   <FieldVal>123</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
<userField>
   <FieldName>TEST2</FieldName>
   <FieldVal>999</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
<userField>
   <FieldName>TEST3</FieldName>
   <FieldVal>756</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
<userField>
   <FieldName>TEST4</FieldName>
   <FieldVal>1234</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
...
</userFields>
  

Мне нужно получить значение FieldVal для определенного «FieldName», скажем, мне нужно значение FieldVal для FieldName «TEST2» (в данном случае 999), как мне это сделать, пожалуйста?
Цель состоит в том, чтобы сохранить значение в переменной и добавить его в качестве отдельного пользовательского поля в XML, чтобы результат выглядел следующим образом —

 <userFields>
<userField>
   <FieldName>TEST1</FieldName>
   <FieldVal>123</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
<userField>
   <FieldName>TEST2</FieldName>
   <FieldVal>999</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
<userField>
   <FieldName>TEST3</FieldName>
   <FieldVal>756</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
<userField>
   <FieldName>TEST4</FieldName>
   <FieldVal>1234</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
...
</userFields>
<variableX>999</variableX>
  

Я хотел бы сохранить значение Fieldval для TEST2 в переменной в XML. это так, потому что я могу передать эту переменную в качестве аргумента для последующей выборки из БД. Спасибо.

Ответ №1:

Выражение, которое вы ищете, это..

 <xsl:variable name="field" select="//userField[FieldName='TEST2']/FieldVal" />
  

В качестве альтернативы, определите ключ для поиска элементов..

 <xsl:key name="userFields" match="userField" use="FieldName" />
  

Затем вы можете выполнить поиск следующим образом…

 <xsl:variable name="field" select="key('userFields', 'TEST2')/FieldVal" />
  

Попробуйте этот XSLT

 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:key name="userFields" match="userField" use="FieldName" />
  <xsl:param name="fieldName" select="'TEST4'" />

    <xsl:variable name="field" select="key('userFields', $fieldName)/FieldVal" />

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="userFields">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
    <variableX>
       <xsl:value-of select="$field" />
    </variableX>
  </xsl:template>
</xsl:stylesheet>
  

Обратите внимание, что я сделал «TEST2» параметром, чтобы он мог быть передан основным приложением.

Также обратите внимание на использование шаблона идентификации для копирования существующих значений.

Комментарии:

1. Спасибо за ответ, Тим. Однако, если я немного изменю требование и захочу присвоить значение переменной chosenval? Будет ли это что-то вроде этого —

2. Возможно, было бы лучше отредактировать ваш вопрос с учетом вашего «измененного» требования. Спасибо!

3. Я внес изменения в свой ответ, чтобы показать, как вы можете сохранить результат в переменной

4. Спасибо, Тим, оба ответа помогли мне узнать что-то новое. Ты звезда.