具有本地功能的XSLT-UNBPRFX

时间:2014-11-27 04:09:19

标签: xslt xquery marklogic

我正在尝试使用带有本地函数的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 &quot;1.0-ml&quot;;&#10;&#10;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 &quot;1.0-ml&quot;;&#10;&#10;declare function loc...", (), <options xmlns="xdmp:eval"><database>15163595336534263915</database><isolation>different-tr...</options>)
$xquery := "xquery version &quot;1.0-ml&quot;;&#10;&#10;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())

2 个答案:

答案 0 :(得分:1)

错误是关于未声明的命名空间。但遗憾的是,添加本地名称空间decl不会有帮助。它无法找到该功能。本地函数不会传递到xslt-eval的上下文。您有两种选择:

  1. 将函数转换为xsl:function
  2. 将XQuery函数推送到库中,然后导入
  3. 您可以像这样导入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