XSLT replace() 函数似乎不起作用

XSLT replace() function does not seem to be working

我正在使用 XSLT 将 xml 模式转换为 JSON 格式,其中有一个模式分面,如下所示:

                <simpleType>
                <restriction base="string">
                    <pattern value="[A-Z0-9a-z_]+(@\{UUID\}|@\{TIMEMILLIS\})?[A-Z0-9a-z]*"/>
                </restriction>
            </simpleType>

虽然正则表达式转义需要 '\' 字符,但在转换为 JSON 时,它们需要进一步转义。

我在 Saxon 中使用 XSLT 3.0,如下所示:

<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() 函数在这里似乎不起作用。

我可能遗漏了什么。我指的是 here.

中的函数定义

如有任何帮助,我们将不胜感激。

使用 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-to-json 函数期望的 XML 格式:

<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

要用\替换\,你需要写

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

那是因为替换字符串中的转义规则。 (规则选择不当,我们试图与其他语言兼容,但事实证明其他语言在这方面完全不一致。)

还有另一种选择:使用 'q' 标志:

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