У меня есть некоторый 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 был бы для этого?
Следующее преобразование показывает два способа достижения этого - с использованием и без использования
и функция 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 ()
для удаления любых начальных или конечных пробельных символов из значения <ключ>
.
Ваш 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"/>