Вариант michael-hor257k предлагает использовать простой процессор XSLT-1.0, такой как xsltproc
(или любой другой XSLT-1.0), и передавать строки в качестве глобального параметра в таблицу стилей. .
Здесь параметр называется strings
, а различные значения разделяются запятыми. Эта таблица стилей использует рекурсивный шаблон для добавления элементов <reason...>
с соответствующими атрибутами value
.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="strings" />
<xsl:template match="/reasonConfig">
<xsl:copy>
<reasons>
<xsl:call-template name="rs">
<xsl:with-param name="strs" select="concat($strings,',')" />
</xsl:call-template>
</reasons>
</xsl:copy>
</xsl:template>
<xsl:template name="rs">
<xsl:param name="strs" />
<xsl:if test="$strs != ''">
<reason>
<xsl:attribute name="value">
<xsl:value-of select="normalize-space(substring-before($strs,','))" />
</xsl:attribute>
</reason>
<xsl:call-template name="rs">
<xsl:with-param name="strs" select="substring-after($strs,',')" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Так, например, если вы передаете значения с параметром в таблицу стилей XSLT, вы можете сделать это с помощью программы linux xsltproc
следующим образом:
xsltproc --stringparam strings "ab,cd,ef" test.xslt test.xml
и вывод будет
<reasonConfig>
<reasons>
<reason value="ab"/>
<reason value="cd"/>
<reason value="ef"/>
</reasons>
</reasonConfig>
С использованием Java подход очень похож:
Одной из возможностей будет использование StringJoiner
класса для генерации строки через запятую. Затем передайте эту строку процессору XSLT.
Для javax.xml.transform.Transformer
вы можете сделать это с помощью метода setParameter
следующим образом (настроить arrayStringWithValues
):
// Create and configure XSLT Transformer
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xslt));
transformer.setParameter("strings", arrayStringWithValues);