Решение, предоставленное Вебби , работает из-за странных характеристик xsl:value-of
в XSLT 1.0 , а именно, даже если выражение XPath вернуло несколько узлов,значение для вывода берется только из первого узла.
Это решение не будет работать в XSLT 2.0 , где xsl:value-of
выводит значения все найдены узлы.
Чтобы скрипт мог выводить только first после родственного брата, выражение XPath должно быть дополнено [1]
(работает также в XSLT 1.0 ).
Еще одна деталь заключается в том, что в версии 2.0 replace
поддерживается функция, поэтому вам не нужно StringUtils пространство имен.
Так что, если вы можете использовать версию 2.0 , мое предложение:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="record/fields">
<record>
<xsl:for-each select="fieldname">
<xsl:variable name="fieldName" select="replace(.,'"','')"/>
<xsl:element name="{$fieldName}">
<xsl:value-of select="following-sibling::fieldvalue[1]"/>
</xsl:element>
</xsl:for-each>
</record>
</xsl:template>
</xsl:stylesheet>
Рабочий пример см. http://xsltransform.net/nbiCsZa
Редактировать
Дажев XSLT 1.0 в этом случае вы можете обойтись без StringUtils пространства имен.Вместо str:replace
, вы можете позвонить translate
(поддерживается в версии 1.0 ), поэтому соответствующую инструкцию следует изменить на:
<xsl:variable name="fieldName" select="translate(.,'"','')"/>