Я видел несколько сообщений об использовании tokenize() для разделения строк, но все они связаны с одним полем. У меня немного другая ситуация и я не знаю, как к ней подойти.
Мой XML может выглядеть примерно так:
<somefield>
<code>A,B,C</code>
<description>Description of A; Description of B; Description of C</description>
</somefield>
Я хочу преобразовать это во что-то вроде этого:
{
"somefield": [
{
"code": "A",
"description": "Description of A"
},
{
"code": "B",
"description": "Description of B"
},
{
"code": "C",
"description": "Description of C"
}
]
}
Я не совсем понимаю, как разделить оба поля одновременно. Есть идеи?
Это недействительный JSON, не так ли?
Я прошу прощения. Я выбрал несколько версий XSLT, поскольку меня интересовали решения в любой из версий.
Нет, это недействительный JSON. Это игрушечный пример, и я забыл удалить лишний комментарий. Я исправлю это, если ТАК позволит мне.
Его все равно нужно заключить в фигурные скобки.
Решение XSLT 1.0 должно было бы радикально отличаться — если только ваш процессор не поддерживает токенизацию в качестве функции расширения. См. пример здесь: stackoverflow.com/a/62276436/3016153





В XSLT 2.0 вы могли бы сделать что-то вроде
<xsl:stylesheet version = "2.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "xml" indent = "yes"/>
<xsl:template match = "/somefield">
<array key = "somefield">
<xsl:variable name = "descr" select = "tokenize(description, ';')"/>
<xsl:for-each select = "tokenize(code, ',')">
<xsl:variable name = "i" select = "position()"/>
<map>
<string key = "code">
<xsl:value-of select = "."/>
</string>
<string key = "description">
<xsl:value-of select = "$descr[$i]"/>
</string>
</map>
</xsl:for-each>
</array>
</xsl:template>
</xsl:stylesheet>
получить:
<?xml version = "1.0" encoding = "UTF-8"?>
<array key = "somefield">
<map>
<string key = "code">A</string>
<string key = "description">Description of A</string>
</map>
<map>
<string key = "code">B</string>
<string key = "description"> Description of B</string>
</map>
<map>
<string key = "code">C</string>
<string key = "description"> Description of C</string>
</map>
</array>
(Извините, у меня нет времени настроить это для вывода JSON.)
Я смог настроить это так, чтобы делать то, что мне нужно. Большое спасибо.
В 3.0 вы могли бы сделать
array {
for-each-pair(tokenize(code, ','),
tokenize(description, ';'),
function($x, $y) {
map{"code": $x, "description": $y}
})
}
Есть ли способ расширить это до 3 или более последовательностей?
@y.arazim, да, ты можешь использовать, например. пример сгиба влево
Это так элегантно.
Пожалуйста, выберите XSLT 1.0 или 2.0, но не обе версии.