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>
要用\
替换\
,你需要写
replace($x, '\', '\\')
那是因为替换字符串中的转义规则。 (规则选择不当,我们试图与其他语言兼容,但事实证明其他语言在这方面完全不一致。)
还有另一种选择:使用 'q' 标志:
replace($x, '\', '\', 'q')
我正在使用 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>
要用\
替换\
,你需要写
replace($x, '\', '\\')
那是因为替换字符串中的转义规则。 (规则选择不当,我们试图与其他语言兼容,但事实证明其他语言在这方面完全不一致。)
还有另一种选择:使用 'q' 标志:
replace($x, '\', '\', 'q')