Да, FailedDev прав.Кто-то написал бы это для вас:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:param name="outputElements" select=" 'FUND_ID,SEC_ID,VALDATE' " />
<xsl:template match="rfb2_item">
<xsl:for-each select="*[contains($outputElements, local-name()) or $outputElements = '*']">
<xsl:sort select="string-length(substring-before($outputElements, local-name(.)))" />
<xsl:value-of select="text()" />
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
Бит объяснения.xsl:for-each
выберет каждый элемент в текущем rfb2_item
, для которого локальное имя содержится в параметре outputElements
, или для которого параметр outputElements
равен *
(который всегда будет иметь значение true, если этодело).Затем он будет сортировать те, которые основаны на длине подстроки, которая идет перед этим локальным именем в outputElements
.Так как это значение становится больше, когда имя встречается позже в этом параметре, это приводит к упорядочению на основе вашего параметра.
Пример: элемент VALDATE
даст FUND_ID,SEC_ID
для функции substring-before
, которая, в свою очередь,даст 14 в качестве длины строки.Это больше, чем 8, которое вы получите за SEC_ID
, то есть значение VALDATE
упорядочено после SEC_ID
.
После xsl:sort
мы просто используем xsl:value-of
длявыведите значение элемента.Вы могли бы хотеть урезать посторонние пробелы там.Наконец, мы проверяем, не совпадает ли позиция с последним узлом в текущем контексте (то есть xsl:for-each
после сортировки ), и, если да, выводим запятую.Это позволяет избежать вывода запятой после последнего значения.
Разрыв строки, который я вставил с использованием xsl:text
, предполагает соглашение Windows / DOS.Удалите
, если файл должен использовать только символы новой строки для разрыва строки, вместо возврата каретки + новой строки.
Обратите внимание, что в выводе CSV это не может быть запятыми!Я оставлю это на ваше усмотрение.Было бы интересно изучить использование функций расширения для делегирования этой задачи Java, если это окажется слишком сложным в XSLT / XPath.