#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. Спасибо, Тим, оба ответа помогли мне узнать что-то новое. Ты звезда.