Я использую XSLT для преобразования схемы xml в формат JSON, где есть фасет шаблона, как показано ниже:
<simpleType>
<restriction base="string">
<pattern value="[A-Z0-9a-z_]+(@\{UUID\}|@\{TIMEMILLIS\})?[A-Z0-9a-z]*"/>
</restriction>
</simpleType>
Хотя символы '\' необходимы для экранирования регулярных выражений, при преобразовании в JSON их необходимо дополнительно экранировать.
Я использую XSLT 3.0 с Saxon следующим образом:
<if test="child::xsi:simpleType/child::xsi:restriction/child::xsi:pattern">
<text>,"pattern":"</text><value-of select="replace(attribute::value,'\\','\\')"/><text>"</text>
</if>
Результат по-прежнему оказывается
"pattern": "[A-Z0-9a-z_]+(@\{UUID\}|@\{TIMEMILLIS\})?[A-Z0-9a-z]*"
в формате JSON. Я пробовал много комбинаций, функция replace () здесь не работает.
Я, наверное, что-то упускаю. Я имею в виду определение функции из здесь.
Любая помощь будет оценена.
output method="json"
соответственно сериализацию JSON, которая позаботится о любом экранировании внутри строковых значений JSON, если это проблема, которую вы пытаетесь решить. Поэтому не пытайтесь создать JSON вручную, просто создайте XML, которыйxml-to-json
может использовать, или создайте карты XPath 3.1 и сериализуйте их как JSON. - person Martin Honnen   schedule 22.01.2019replace
работает как указано w3.org/TR/xpath- functions / # func-replace, если вы хотите заменить единственный _2 _ \\\ `в третьем аргументе. Я не понимаю, почему вы хотите создавать JSON вручную и выполнять замену здесь и там, где, по вашему мнению, он вам нужен, вместо того, чтобы полагаться на существующую сериализацию JSON, встроенную в XSLT / XPath 3. - person Martin Honnen   schedule 22.01.2019replace
не работает, заключается в том, что вы не находитесь в элементеxsl:pattern
, когда делаете это. Вам следует сделатьreplace(xsi:simpleType/xsi:restriction/xsi:pattern/@value,'\\','\\\\')"
- person Tim C   schedule 22.01.2019