在使用 Saxon 12.1 时,我尝试使用功能
xml-to-json
新选项条目number-formatter
。撒克逊人似乎认出了它,但我的输出没有任何变化。
输入 XML
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="repro.xsd">
<OptionPosition>-27975240</OptionPosition>
</root>
输入 XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns="http://www.w3.org/2005/xpath-functions" xmlns:hr="hr" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:math="http://www.w3.org/2005/xpath-functions/math" xmlns:array="http://www.w3.org/2005/xpath-functions/array" xmlns:map="http://www.w3.org/2005/xpath-functions/map" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:err="http://www.w3.org/2005/xqt-errors" exclude-result-prefixes="array fn map math xhtml xs err" version="3.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!--<xsl:import-schema schema-location="repro.xsd"/>-->
<xsl:function name="hr:really-good" as="xs:string">
<xsl:param name="input" as="xs:string"/>
1</xsl:function>
<xsl:template match="/" name="xsl:initial-template">
<xsl:variable name="mine">
<map>
<array key="AdjudicatorName">
<number>
<xsl:value-of select="/root/OptionPosition"/>
</number>
</array>
</map>
</xsl:variable>
<xsl:value-of select="xml-to-json($mine, map{'number-formatter': hr:really-good })" />
</xsl:template>
</xsl:stylesheet>
我意识到 Saxon 文档中没有任何地方说它已实现,但也没有说它不是。
我从命令行使用这个查询做了一个快速测试:
let $x := <fn:number xmlns:fn='http://www.w3.org/2005/xpath-functions'>25</fn:number>
return xml-to-json($x, map{'number-formatter':function($n){'++++'||$n}})
它产生了输出++++25.
所以这个功能原则上是有效的。
您的代码中存在一个明显的错误,即您已将属性的值设置为
hr:really-good
而不是 hr:really-good#1
,因此它被解释为元素名称而不是函数引用。但是,如果我尝试复制它,我会收到一条明确的错误消息,告诉我该值必须是一个函数。
这可能与代码中的另一个错误有关,即提供给 xml-to-json 函数的 XML 位于错误的命名空间中。但同样,我希望这会导致错误消息。