XSLT replace () не работает - PullRequest
       20

XSLT replace () не работает

0 голосов
/ 22 января 2019

Я использую 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 () здесь не работает.

Я, наверное, что-то упустил. Я имею в виду определение функции из здесь .

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Чтобы заменить \ на \\, нужно написать

replace($x, '\\', '\\\\')

Это из-за правил экранирования в строке замены. (Правила были выбраны плохо, мы пытались быть совместимыми с другими языками, но другие языки оказались совершенно несовместимыми в этой области.)

Есть еще один вариант: используйте флаг 'q':

replace($x, '\', '\\', 'q')
0 голосов
/ 22 января 2019

Используйте поддержку в XSLT и XPath 3 для создания и сериализации JSON, например, для создания карт и сериализации в виде JSON

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-skip"/>

  <xsl:output method="json" indent="yes"/>

  <xsl:template match="pattern">
      <xsl:sequence select="map { local-name() : data(@value) }"/>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / pPzifoX

или создание формата XML, ожидаемого функцией xml-to-json:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.w3.org/2005/xpath-functions"
    exclude-result-prefixes="#all"
    expand-text="yes"
    version="3.0">

  <xsl:mode on-no-match="shallow-skip"/>
  <xsl:strip-space elements="*"/>

  <xsl:output method="text" indent="yes"/>

  <xsl:variable name="json-xml">
      <xsl:apply-templates/>
  </xsl:variable>

  <xsl:template match="/">
      <xsl:value-of select="xml-to-json($json-xml, map { 'indent' : true() })"/>
  </xsl:template>

  <xsl:template match="pattern">
      <map>
          <string key="{local-name()}">{@value}</string>
      </map>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / pPzifoX / 1

...