草庐IT

xml - 编写有效的 XSLT

coder 2024-06-23 原文

编写有效的 XSLT 的原则和模式是什么?

当我说“有效”时,我的意思是它是

  • 结构良好且可读性强
  • 简单、简洁
  • 高效(即具有良好的性能)

  • 简而言之,我正在寻找 XSLT 的最佳实践。

    我已经看过 the question regarding efficiency ,但是如果您无法理解它在做什么,那么高效的代码就失去了它的值(value)。

    最佳答案

    一、优雅的XSLT代码

    人们经常可以找到漂亮的 XSLT 代码示例,尤其是当 XSLT 用作函数式编程语言时 .

    示例见 this articleFXSL 2.0 -- XSLT 2.0 的函数式编程库。

    作为 FP 语言的 XSLT 也是 declarative language .这,除其他外,意味着一个声明,指定现有的关系。

    这样的定义通常不需要任何额外的代码来产生结果——它本身就是它自己的实现,或者一个可执行定义或可执行规范 .

    这是一个小例子 .

    这个 XPath 2.0 表达式定义了 “自然数的最大值 Prime Factor”:

    if(f:isPrime($pNum))
      then $pNum
      else
        for $vEnd in xs:integer(floor(f:sqrt($pNum, 0.1E0))),
            $vDiv1 in (2 to $vEnd)[$pNum mod . = 0][1],
            $vDiv2 in $pNum idiv $vDiv1
          return
            max((f:maxPrimeFactor($vDiv1),f:maxPrimeFactor($vDiv2)))
    

    用英语发音 , 一个数的最大质因数 pNum 是数字本身,如果 pNum 是素数,否则如果 vDiv1 vDiv2 的两个因子pNum ,则最大质因数 pNum 的最大质因数中的较大者vDiv1 vDiv2 .

    我们如何使用它来实际计算 XSLT 中的最大素因数? 我们简单地总结一下上面的定义 <xsl:function>和......得到结果!
     <xsl:function name="f:maxPrimeFactor" as="xs:integer">
      <xsl:param name="pNum" as="xs:integer"/>
    
      <xsl:sequence select=
       "if(f:isPrime($pNum))
          then $pNum
          else
            for $vEnd in xs:integer(floor(f:sqrt($pNum, 0.1E0))),
                $vDiv1 in (2 to $vEnd)[$pNum mod . = 0][1],
                $vDiv2 in $pNum idiv $vDiv1
              return
                max((f:maxPrimeFactor($vDiv1),f:maxPrimeFactor($vDiv2)))
       "/>
     </xsl:function>
    

    那么我们可以calculate the MPF for any natural number , 例如:
    f:maxPrimeFactor(600851475143) = 6857

    至于效率,嗯,此转换只需 0.109 秒 .

    优雅高效的 XSLT 代码的其他示例 :
  • Tim BrayWide Finder ,已解决 here .
  • Cascade deletions
  • Transitive closure
  • Finding all anagrams一句话
  • Concordance文本语料库(旧约)
  • Spelling checking (莎士比亚的奥赛罗)
  • Sudoku solver

  • 二、一些规则

    以下是编写“高质量 XSLT 代码”的一些规则,摘自 Mukul Ghandi's blog .

    可以使用 tool developed by Mukul 来检查/强制执行它们。 :
  • DontUseDoubleSlashOperatorNearRoot:避免在大树的根部附近使用运算符//。
  • DontUseDoubleSlashOperator:避免在 XPath 表达式中使用运算符//。
  • SettingValueOfVariableIncorrectly:如果分配字符串值,则使用“选择”语法为变量分配值。
  • EmptyContentInInstructions:不要将空内容用于“xsl:for-each”、“xsl:if”、“xsl:when”等指令。
  • DontUseNodeSetExtension:如果使用 XSLT 2.0,则不要使用节点集扩展功能。
  • RedundantNamespaceDeclarations:在 xsl:stylesheet 元素中有多余的命名空间声明。
  • UnusedFunction:未使用样式表函数。
  • UnusedNamedTemplate:样式表中的命名模板未使用。
  • UnusedVariable:样式表中未使用变量。
  • UnusedFunctionTemplateParameter:函数或模板参数在函数/模板主体中未使用。
  • TooManySmallTemplates:样式表中的低粒度模板过多(10 个或更多)。
  • MonolithicDesign:在样式表中使用单个模板/函数。您可以模块化代码。
  • OutputMethodXml:在生成 HTML 代码时使用输出方法 'xml'。
  • NotUsingSchemaTypes:在 XSLT 2.0 模式下工作时,样式表不使用任何内置模式类型(xs:string 等)。
  • UsingNameOrLocalNameFunction:当 local-name() 可能合适时使用 name() 函数(反之亦然)。
  • FunctionTemplateComplexity:函数或模板的大小/复杂度很高。需要重构代码。
  • NullOutputFromStylesheet:样式表没有生成任何有用的输出。请重新查看样式表逻辑。
  • UsingNamespaceAxis:在 XSLT 2.0 模式下工作时,使用已弃用的命名空间轴。
  • CanUseAbreviatedAxisSpecifier:使用长轴说明符,如 child::、attribute:: 或 parent::node()。
  • UsingDisableOutputEscaping:已将禁用输出转义属性设置为"is"。请重新查看样式表逻辑。
  • NotCreatingElementCorrectly:当可以直接使用 xsl:element 指令创建元素节点时。
  • AreYouConfusingVariableAndNode:您可能会将变量引用与节点引用混淆。 (由 Alain Benedetti 提供)
  • IncorrectUseOfBooleanConstants:错误地将 bool 常量用作“true”或“false”。 (由托尼·拉维尼奥提供)
  • ShortNames:为变量/函数/模板使用单个字符名称。为这些功能使用有意义的名称。
  • NameStartsWithNumeric:变量/函数/模板名称以数字字符开头
  • 关于xml - 编写有效的 XSLT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/741050/

    有关xml - 编写有效的 XSLT的更多相关文章

    1. ruby - 在 Ruby 中编写命令行实用程序 - 2

      我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

    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 - 如何进行排列以有效地定制输出 - 2

      这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

    4. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

      我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

    5. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

      是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

    6. ruby-on-rails - 如何为空白字段编写 rspec? [Rails3.1] - 2

      我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona

    7. ruby-on-rails - 尝试为 Rails 中的用户名验证编写 REGEX - 2

      我正在尝试用Ruby(Rails)编写一个正则表达式,以便用户名的字符仅包含数字和字母(也没有空格)。我有这个正则表达式,/^[a-zA-Z0-9]+$/,但它似乎没有用,我在Rails中收到一个错误,说“The如果正则表达式使用多行anchor(^或$),这可能会带来安全风险。您是要使用\A和\z,还是忘记添加:multiline=>true选项?"我的user.rb模型中此实现的完整代码是:classUser我做错了什么以及如何修复此正则表达式,使其仅对数字和字母有效而不对空格有效?谢谢。 最佳答案 简短回答:使用/\A[a-z

    8. ruby - 为什么这个救援语法有效? - 2

      好的,所以我有了我正在使用的应用程序的这种方法,它可以在生产中使用。我的问题为什么这行得通?这是新的Ruby语法吗?defeditload_elements(current_user)unlesscurrent_user.role?(:admin)respond_todo|format|format.json{render:json=>@user}format.xml{render:xml=>@user}format.htmlendrescueActiveRecord::RecordNotFoundrespond_to_not_found(:json,:xml,:html)end

    9. ruby-on-rails - 如何编写跨模型、 Controller 和 View 的 Rails mixin - 2

      为了减少我的小Rails应用程序中的代码重复,我一直致力于将我的模型之间的通用代码放入它自己的单独模块中,到目前为止一切顺利。模型的东西相当简单,我只需要在开头包含模块,例如:classIso这工作正常,但是现在,我将有一些Controller和View代码,这些代码也将在这些模型之间通用,到目前为止,我有这个用于我的可发送内容:#Thisisamodulethatisusedforpages/formsthatarecanbe"sent"#eitherviafax,email,orprinted.moduleSendablemoduleModeldefself.included(kl

    10. ruby-on-rails - 如何在 Rails 3 中禁用 XML 解析 - 2

      我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::

    随机推荐