草庐IT

xml - Saxon 过早评估 xsl :attribute-set

coder 2024-07-05 原文

这与使用最新的 Saxon EE 9.8 对输入到 XSLT 转换的模式感知验证有关。

我的 XSLT 文件包含以下内容。

这样定义的命名空间和关联模式:

<xsl:import-schema namespace="http://www.fpml.org/2005/FpML-4-2" schema-location="/path/to/some_swbml.xsd"/>

符合上述模式的结果文档:

<xsl:result-document method="xml" href="{$file}" format="swbml-format" validation="strict">
    <SWBML xmlns="http://www.fpml.org/2005/FpML-4-2" xsl:use-attribute-sets="ir">
        GENERATE SOME MORE XML TO BE VALIDATED BY THE XSD
    </SWBML>
 </xsl:result-document>

你会注意到结果文档中的父标签<SWBML>使用属性集 xsl:use-attribute-sets="ir" .

属性集定义如下:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:attribute-set name="ir">
        <xsl:attribute name="version">4-2</xsl:attribute>
    </xsl:attribute-set>
</xsl:stylesheet>

这是一个玩具示例,上面的样板文件不合理!

当我将它用于:

 java net.sf.saxon.Transform -sa -ext:on -it -o:output.xml -xsl:example.xslt

这是预料之中的,因为据我所知,“-sa”只会检查输出的 XML 文档。

这行不通:

java net.sf.saxon.Transform -val:lax -ext:on -it -o:output.xml -xsl:example.xslt

给予:

FORG0001: Attribute @xsl:use-attribute-sets is not allowed on element <SWBML>

我的问题是 - 验证器不应该在尝试验证 <SWBML> 之前处理属性集吗? ?在我看来,它似乎在提示输出 XML 文档中不允许使用 XSLT 指令,这当然是正确的,但它似乎过早地进行了检查。

生成的 XML 是有效的:

<SWBML xmlns="http://www.fpml.org/2005/FpML-4-2" version="4_2">

如使用“-sa”选项进行转换所示。

我不确定这是 XSLT 的限制,还是 Saxon 处理中的错误?感觉应该可以这样对我!

有什么想法吗?

最佳答案

我无法重现这一点。

我运行了这个样式表:

<xsl:transform 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:import-schema namespace="http://www.fpml.org/2005/FpML-4-2">
    <xs:schema targetNamespace="http://www.fpml.org/2005/FpML-4-2">
      <xs:element name="SWBML">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="version" type="xs:decimal"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </xsl:import-schema>

  <xsl:template name="xsl:initial-template">
    <xsl:result-document method="xml" validation="strict">
      <SWBML xmlns="http://www.fpml.org/2005/FpML-4-2" xsl:use-attribute-sets="ir">
        GENERATE SOME MORE XML TO BE VALIDATED BY THE XSD
      </SWBML>
    </xsl:result-document>
  </xsl:template> 

    <xsl:attribute-set name="ir">
      <xsl:attribute name="version">4.2</xsl:attribute>
    </xsl:attribute-set>


</xsl:transform>

使用命令行选项:

-xsl:test.xsl -sa -val:lax -it -t

它运行良好。

在我看来,您似乎出于某种原因正在验证样式表本身。也许样式表使用构造 document("") 来读取它自己的源代码,在这种情况下,松散的验证将启动并导致此失败。如果这不是解释,请提供更多关于您正在做什么的详细信息。

关于xml - Saxon 过早评估 xsl :attribute-set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50493231/

有关xml - Saxon 过早评估 xsl :attribute-set的更多相关文章

  1. ruby-on-rails - rails : keeping DRY with ActiveRecord models that share similar complex attributes - 2

    这似乎应该有一个直截了当的答案,但在Google上花了很多时间,所以我找不到它。这可能是缺少正确关键字的情况。在我的RoR应用程序中,我有几个模型共享一种特定类型的字符串属性,该属性具有特殊验证和其他功能。我能想到的最接近的类似示例是表示URL的字符串。这会导致模型中出现大量重复(甚至单元测试中会出现更多重复),但我不确定如何让它更DRY。我能想到几个可能的方向...按照“validates_url_format_of”插件,但这只会让验证干给这个特殊的字符串它自己的模型,但这看起来很像重溶液为这个特殊的字符串创建一个ruby​​类,但是我如何得到ActiveRecord关联这个类模型

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  4. ruby - Sinatra set cache_control to static files in public folder编译错误 - 2

    我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.

  5. ruby - Arrays Sets 和 SortedSets 在 Ruby 中是如何实现的 - 2

    通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复

  6. ruby - Rails -- :id attribute? 所需的数据库索引 - 2

    因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration

  7. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  8. ruby-on-rails - 了解 "attribute_will_change!"方法 - 2

    我想覆盖store_accessor的getter。可以查到here.代码在这里:#Fileactiverecord/lib/active_record/store.rb,line74defstore_accessor(store_attribute,*keys)keys=keys.flatten_store_accessors_module.module_evaldokeys.eachdo|key|define_method("#{key}=")do|value|write_store_attribute(store_attribute,key,value)enddefine_met

  9. ruby - 在 Ruby 中的另一个上下文中评估潜在的相对 URI - 2

    我在Ruby程序中有两个URI。一个肯定是绝对URI,另一个可能是绝对URI或相对URI。我想在第一个的上下文中将第二个转换为绝对URI,所以如果第一个是http://pupeno.com/blog第二个是/about,结果应该是http://pupeno.com/about.有什么想法吗? 最佳答案 Ruby的内置URI和Addressablegem,做这个简短的工作。我更喜欢Addressable,因为它功能更全面,但URI是内置的。require'uri'URI.join('http://pupeno.com/blog','/

  10. ruby - block 内的实例评估 - 2

    我有一个Builder类,可让您添加到其中一个实例变量:classBuilderdefinitialize@lines=[]enddeflinesblock_given??yield(self):@linesenddefadd_line(text)@lines现在,我该如何改变它my_builder=Builder.newmy_builder.lines{|b|b.add_line"foo"b.add_line"bar"}pmy_builder.lines#=>["foo","bar"]进入这个?my_builder=Builder.newmy_builder.lines{add_li

随机推荐