Можно ли обновить XML с помощью XSLT для массива значений? - PullRequest
0 голосов
/ 17 ноября 2018

Предположим, у меня есть xml-код, подобный

<reasonConfig>
    <reasons/>
</reasonConfig>

. Я могу иметь массив строк в качестве входных данных и хочу обновить узел этими значениями.Требуемый вывод будет выглядеть как

<reasonConfig>
    <reasons>
        <reason value="First Form"/>
        <reason value="Second Form"/>
        <reason value="Third Form"/>
    </reasons>
</reasonConfig>

Массив String имеет такие значения, как {"Первая форма", "Вторая форма", "Третья форма"}

В настоящее время я сделаю копиюконкретного узла и обновите строку «value» с помощью приведенного ниже xsl-кода для n раз.

<xsl:param name="value" />
<xsl:template match="reason">
<reason value="{$value}"></reason >
</xsl:template>

Есть ли способ выполнить полное преобразование за шаг?как получить массив входных значений и добавить новые строки, соответствующие этому в xml?

1 Ответ

0 голосов
/ 17 ноября 2018

Вариант 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...