首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Saxon-js是否对xsl:param执行XML语法检查?

Saxon-js是否对xsl:param执行XML语法检查?
EN

Stack Overflow用户
提问于 2021-05-31 10:18:39
回答 1查看 81关注 0票数 0

我通过Saxon-js运行这个XSL脚本。它使用在转换调用中接收到的stylesheetParams更新主输入XHTML中的成本字段。一切都很好。问题是没有对param-XML进行语法检查(您可以在注释掉的行中看到它的样子)。它位于XHTML上,转换将生成一个错误,但不是在param-XML上。它只是允许它进入,然后键函数就不会更新XHTML。有没有办法在相同的转换调用中检查格式正确的XML参数,或者我必须使用两个转换调用:调用param-XSL上的转换进行语法检查,然后调用这个主转换来更新XHTML?

代码语言:javascript
复制
<xsl:stylesheet version="3.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all"
  expand-text="yes">
  <xsl:output method="html" omit-xml-declaration="yes" encoding="UTF-8" include-content-type="no"/>
  <xsl:param name="cost-data"/>
    <!-- <supplier><product><key>3</key><pcost uptype="1"><key>21341</key><cost>12.99</cost></pcost></product></supplier> -->
    <!-- </xsl:param> -->
  
  <xsl:key name="cost" match="product/pcost[@uptype = 1]/cost" use="'cost' || ancestor::product/key"/>
  
  <xsl:mode on-no-match="shallow-copy"/>
        
  <xsl:template match="td[@name][key('cost', @name, fn:parse-xml($cost-data))]/text()">{key('cost', ../@name, fn:parse-xml($cost-data))}%</xsl:template>

<xsl:template match="/" name="xsl:initial-template">
  <xsl:next-match/>
</xsl:template>
</xsl:stylesheet>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-31 15:17:04

如果您的样式表代码是

代码语言:javascript
复制
<xsl:param name="cost-data">
    <supplier><product><key>3</key><pcost uptype="1"><key>21341</key>     
       <cost>12.99</cost></pcost></product></supplier>
</xsl:param>

那么这就是格式良好的XML,不应该报告任何错误。

然而,fn:parse-xml($cost-data)错了。该参数的值是一个节点树,而不是字符串,fn:parse- XML ()需要字符串中的词法XML。在此节点树上调用fn:parse-xml()的效果是首先原子化节点,生成无类型的原子值"32134112.99",然后尝试将此字符串"32134112.99“解析为词法XML,这应该会失败。

为了避免这样的混淆,最好总是声明期望的参数类型,例如as="xs:string"as="document-node()"

如果希望$cost-data的默认值是包含词法XML的字符串,请尝试

代码语言:javascript
复制
<xsl:param name="cost-data" as="xs:string"><![CDATA[
    <supplier><product><key>3</key><pcost uptype="1"><key>21341</key>     
       <cost>12.99</cost></pcost></product></supplier>
]]></xsl:param>

所有内容都在一行上,没有空格(或者如果您需要空格以提高可读性,请将其放在">“分隔符之前)。

注意:你的问题的字面答案是:不。Saxon-JS不执行此检查。XML解析器在Saxon-JS看到数据之前很久就会执行该操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67767245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档