Как я могу получить значение из пары ключ/значение xml с xpath в моем xslt?
у меня есть xml, который я хочу обработать с помощью xslt. Хороший объем данных поступает в пары ключевых значений (см. ниже). Я борюсь с тем, как извлечь базу значений на ключе в переменную. Я хотел бы иметь возможность сделать что-то вроде этого:
<xsl:variable name="foo" select="/root/entry[key = 'foo']/value"/>
но это, похоже, не работает. Вот пример xml.
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<entry>
<key>
foo
</key>
<value>
bar
</value>
</entry>
</root>
каким будет правильный xpath для этого?
3 ответов
следующее преобразование показывает два способа достижения этого -- С и без использования <xsl:key>
и key()
функция:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:key name="kValueByKey"
match="value" use="normalize-space(../key)"/>
<xsl:template match="/">
1. By key: <xsl:text/>
<xsl:copy-of select="key('kValueByKey', 'foo')"/>
2. Not using key: <xsl:text/>
<xsl:copy-of select="/*/*[normalize-space(key)='foo']/value"/>
</xsl:template>
</xsl:stylesheet>
отметим использование normalize-space()
функции чтобы удалить любые ведущие или конечные пробелы из значения <key>
.
ваш XPath отлично работает для следующего (эквивалентного) документа:
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<entry>
<key>foo</key>
<value>
bar
</value>
</entry>
</root>
вы можете использовать xpath contains
функция, чтобы получить тот же результат без реструктуризации XML:
<xsl:variable name="foo" select="/root/entry[contains(key,'foo')]/value"/>
<xsl:variable name="foo" select="/root/entry[key='foo']/value" />
это точное совпадение so убедитесь, что вокруг foo в XML. В противном случае используйте функцию замены и регулярное выражение, чтобы обрезать их.