我正在尝试使用带有本地函数的XSLT api替换文档中的指定节点列表,但我通过xquery / MarkLogic看到以下异常。
[XSLT] XSLT-UNBPRFX: (err:XTSE0280) Prefix local has no namespace binding
Stack Trace
At line 5 column 0:
In xdmp:xslt-eval(<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><xsl:copy><xsl:apply-templates/></xsl:co...</xsl:stylesheet>, <PersonalInfo><ContactInfo><firstName>Jon</firstName><lastName>Smith</lastName...</PersonalInfo>)
3. declare function local:changecontent($type) as xs:string
4. {
5. switch($type)
6. case "ssn" return "111-11-1111"
7. case "Country" return "United State"
At line 29 column 7:
In xdmp:eval("xquery version "1.0-ml"; declare function loc...", (), <options xmlns="xdmp:eval"><database>15163595336534263915</database><isolation>different-tr...</options>)
$stylesheet := <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><xsl:copy><xsl:apply-templates/></xsl:co...</xsl:stylesheet>
27. </xsl:stylesheet>
28.
29. return xdmp:xslt-eval($stylesheet, document{ <PersonalInfo>
30. <ContactInfo>
31. <firstName>Jon</firstName>
In /MarkLogic/appservices/qconsole/qconsole-amped.xqy on line 200
In amped-qconsole:qconsole-eval("xquery version "1.0-ml"; declare function loc...", (), <options xmlns="xdmp:eval"><database>15163595336534263915</database><isolation>different-tr...</options>)
$xquery := "xquery version "1.0-ml"; declare function loc..."
$vars := ()
$options := <options xmlns="xdmp:eval"><database>15163595336534263915</database><isolation>different-tr...</options>
以下是源代码:
xquery version "1.0-ml";
declare function local:changecontent($type) as xs:string
{
switch($type)
case "ssn" return "111-11-1111"
case "Country" return "United State"
default return "Dummy"
};
let $stylesheet := <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" >
<xsl:template match="/">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="ssn|Country">
<xsl:copy>
<xsl:value-of select="local:changecontent(local-name(.))"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
return xdmp:xslt-eval($stylesheet, document{ <PersonalInfo>
<ContactInfo>
<firstName>Jon</firstName>
<lastName>Smith</lastName>
<ssn>123-33-2222</ssn>
<addr>
<addr1>123 Mocking Bird Lane</addr1>
<city>Queens</city>
<state>NY</state>
</addr>
</ContactInfo>
</PersonalInfo>
}/element())
答案 0 :(得分:1)
错误是关于未声明的命名空间。但遗憾的是,添加本地名称空间decl不会有帮助。它无法找到该功能。本地函数不会传递到xslt-eval的上下文。您有两种选择:
您可以像这样导入XQuery库模块:
<xsl:stylesheet ... extension-element-prefixes="xdmp"
xmlns:json="http://marklogic.com/xdmp/json">
<xdmp:import-module namespace="http://marklogic.com/xdmp/json" href="/MarkLogic/json/json.xqy"/>
..
<xsl:sequence select="json:transform-to-json(.)"/>
..
</xsl:stylesheet>
HTH!
答案 1 :(得分:0)
XSLT-UNBPRFX
表示您有一个未定义的名称空间前缀。 XSLT没有为您定义local
。如果您需要local
的默认定义,可以使用简单的XQuery表达式来获取它:
namespace-uri(<local:x/>)
这会产生:
http://www.w3.org/2005/xquery-local-functions