2020-11-14 09:20:07 +00:00
<!DOCTYPE html>
< html >
< head >
< meta charset = "utf-8" >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
< meta name = "description" content = "This page describes XPath rule support in more details" >
< meta name = "keywords" content = "extendinguserdocs, " >
< title > Writing XPath rules | PMD Source Code Analyzer< / title >
2023-04-28 11:49:15 +00:00
< link rel = "stylesheet" type = "text/css" href = "assets/fontawesome-free-5.15.4-web/css/all.min.css" >
2023-03-03 20:15:41 +00:00
< link rel = "stylesheet" type = "text/css" href = "assets/bootstrap-4.5.2-dist/css/bootstrap.min.css" >
2020-11-14 09:20:07 +00:00
2023-03-03 20:15:41 +00:00
< link rel = "stylesheet" type = "text/css" href = "css/syntax.css" >
< link rel = "stylesheet" type = "text/css" href = "css/modern-business.css" >
< link rel = "stylesheet" type = "text/css" href = "css/customstyles.css" >
< link rel = "stylesheet" type = "text/css" href = "css/theme-green.css" >
< link rel = "stylesheet" type = "text/css" href = "css/pmd-customstyles.css" >
2020-11-14 09:20:07 +00:00
2023-04-28 11:49:15 +00:00
< link rel = "shortcut icon" href = "images/logo/favicon.ico" type = "image/x-icon" >
< link rel = "icon" href = "images/logo/favicon.ico" type = "image/x-icon" >
2020-11-14 09:20:07 +00:00
2023-03-03 20:15:41 +00:00
< link rel = "alternate" type = "application/rss+xml" title = "" href = "feed.xml" >
2020-11-14 09:20:07 +00:00
< / head >
< body >
<!-- Content is offset by the height of the topnav bar. -->
<!-- There's already a padding - top rule in modern - business.css, but it apparently doesn't work on Firefox 60 and Chrome 67 -->
< div id = "topbar-content-offset" >
<!-- Navigation -->
2023-03-03 20:15:41 +00:00
< nav class = "navbar navbar-expand-lg fixed-top navbar-dark" >
2020-11-14 09:20:07 +00:00
< div class = "container topnavlinks" >
2023-03-03 20:15:41 +00:00
< a class = "navbar-brand fas fa-home fa-lg" href = "index.html" > < span class = "projectTitle" > PMD Source Code Analyzer Project< / span > < / a >
< button class = "navbar-toggler" type = "button" data-toggle = "collapse" data-target = "#navbarSupportedContent" aria-controls = "navbarSupportedContent" aria-expanded = "false" aria-label = "Toggle navigation" >
< span class = "navbar-toggler-icon" > < / span >
< / button >
< div class = "collapse navbar-collapse" id = "navbarSupportedContent" >
< ul class = "navbar-nav mr-auto mt-2 mt-lg-0" > < / ul >
< ul class = "navbar-nav" >
2020-11-14 09:20:07 +00:00
<!-- toggle sidebar button -->
2023-03-03 20:15:41 +00:00
< li class = "nav-item" > < a id = "tg-sb-link" class = "nav-link" href = "#" > < i id = "tg-sb-icon" class = "fas fa-toggle-on" > < / i > Nav< / a > < / li >
2020-11-14 09:20:07 +00:00
<!-- entries without drop - downs appear here -->
2023-03-03 20:15:41 +00:00
< li class = "nav-item" > < a class = "nav-link" href = "https://github.com/pmd/pmd/releases/latest" target = "_blank" > Download< / a > < / li >
< li class = "nav-item" > < a class = "nav-link" href = "https://github.com/pmd/pmd" target = "_blank" > Fork us on github< / a > < / li >
2020-11-14 09:20:07 +00:00
<!-- entries with drop - downs appear here -->
<!-- conditional logic to control which topnav appears for the audience defined in the configuration file. -->
< / ul >
2023-03-03 20:15:41 +00:00
< form class = "form-inline my-2 my-lg-0" >
< input class = "form-control mr-sm-2" type = "search" placeholder = "search..." id = "search-input" >
< ul id = "results-container" > < / ul >
< / form >
2020-11-14 09:20:07 +00:00
< / div >
2023-03-03 20:15:41 +00:00
< / div >
2020-11-14 09:20:07 +00:00
< / nav >
<!-- Page Content -->
2022-02-25 09:51:51 +00:00
< div class = "container-toc-wrapper" >
< div class = "container" >
< div class = "col-lg-12" > < / div >
<!-- Content Row -->
< div class = "row" >
2020-11-14 09:20:07 +00:00
2022-02-25 09:51:51 +00:00
<!-- Sidebar Column -->
< div class = "col-md-3" id = "tg-sb-sidebar" >
2020-11-14 09:20:07 +00:00
< ul id = "mysidebar" class = "nav" >
2024-10-25 08:59:30 +00:00
< li class = "sidebarTitle" > PMD 7.8.0-SNAPSHOT< / li >
< div class = "sidebarTitleDate" > Release date: 29-November-2024< / div >
2020-11-14 09:20:07 +00:00
< li >
< a href = "#" > About< / a >
< ul >
< li > < a href = "index.html" > Home< / a > < / li >
2023-03-23 09:46:34 +00:00
< li > < a href = "pmd_release_notes.html" > Release notes< / a > < / li >
2020-11-14 09:20:07 +00:00
2023-03-23 09:46:34 +00:00
< li > < a href = "pmd_release_notes_pmd7.html" > Release notes (PMD 7)< / a > < / li >
2020-11-14 09:20:07 +00:00
< li > < a href = "pmd_about_help.html" > Getting help< / a > < / li >
2024-06-20 14:27:53 +00:00
< li > < a href = "pmd_about_release_policies.html" > Release policies< / a > < / li >
< li > < a href = "pmd_about_support_lifecycle.html" > Support lifecycle< / a > < / li >
2020-11-14 09:20:07 +00:00
< / ul >
< / li >
< li >
< a href = "#" > User Documentation< / a >
< ul >
2023-08-31 14:51:16 +00:00
< li > < a href = "pmd_userdocs_migrating_to_pmd7.html" > Migration Guide for PMD 7< / a > < / li >
2020-11-14 09:20:07 +00:00
< li > < a href = "pmd_userdocs_installation.html" > Installation and basic CLI usage< / a > < / li >
< li > < a href = "pmd_userdocs_making_rulesets.html" > Making rulesets< / a > < / li >
< li > < a href = "pmd_userdocs_configuring_rules.html" > Configuring rules< / a > < / li >
< li > < a href = "pmd_userdocs_best_practices.html" > Best practices< / a > < / li >
< li > < a href = "pmd_userdocs_suppressing_warnings.html" > Suppressing warnings< / a > < / li >
< li > < a href = "pmd_userdocs_incremental_analysis.html" > Incremental analysis< / a > < / li >
< li > < a href = "pmd_userdocs_cli_reference.html" > PMD CLI reference< / a > < / li >
< li > < a href = "pmd_userdocs_report_formats.html" > PMD Report formats< / a > < / li >
2022-09-29 15:04:50 +00:00
< li > < a href = "pmd_userdocs_3rdpartyrulesets.html" > 3rd party rulesets< / a > < / li >
2020-11-14 09:20:07 +00:00
< li class = "subfolders" >
< a href = "#" > CPD reference< / a >
< ul >
< li > < a href = "pmd_userdocs_cpd.html" > Copy-paste detection< / a > < / li >
< li > < a href = "pmd_userdocs_cpd_report_formats.html" > CPD Report formats< / a > < / li >
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > Extending PMD< / a >
< ul >
< li > < a href = "pmd_userdocs_extending_writing_rules_intro.html" > Introduction to writing rules< / a > < / li >
< li > < a href = "pmd_userdocs_extending_your_first_rule.html" > Your first rule< / a > < / li >
< li class = "active" > < a href = "pmd_userdocs_extending_writing_xpath_rules.html" > XPath rules< / a > < / li >
< li > < a href = "pmd_userdocs_extending_writing_java_rules.html" > Java rules< / a > < / li >
< li > < a href = "pmd_userdocs_extending_designer_reference.html" > Rule designer reference< / a > < / li >
< li > < a href = "pmd_userdocs_extending_defining_properties.html" > Defining rule properties< / a > < / li >
< li > < a href = "pmd_userdocs_extending_rule_guidelines.html" > Rule guidelines< / a > < / li >
< li > < a href = "pmd_userdocs_extending_testing.html" > Testing your rules< / a > < / li >
2024-02-09 17:22:16 +00:00
< li > < a href = "pmd_userdocs_extending_ast_dump.html" > Creating (XML) dump of the AST< / a > < / li >
2020-11-14 09:20:07 +00:00
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > Tools / Integrations< / a >
< ul >
< li > < a href = "pmd_userdocs_tools_maven.html" > Maven PMD Plugin< / a > < / li >
< li > < a href = "pmd_userdocs_tools_gradle.html" > Gradle< / a > < / li >
< li > < a href = "pmd_userdocs_tools_ant.html" > Ant< / a > < / li >
< li > < a href = "pmd_userdocs_tools_java_api.html" > PMD Java API< / a > < / li >
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_userdocs_tools_bld.html" > bld PMD Extension< / a > < / li >
2020-11-14 09:20:07 +00:00
< li > < a href = "pmd_userdocs_tools_ci.html" > CI integrations< / a > < / li >
< li > < a href = "pmd_userdocs_tools.html" > Other Tools / Integrations< / a > < / li >
< / ul >
< / li >
< / ul >
< / li >
< li >
< a href = "#" > Rule Reference< / a >
< ul >
< li class = "subfolders" >
< a href = "#" > Apex Rules< / a >
< ul >
< li > < a href = "pmd_rules_apex.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_apex_bestpractices.html" > Best Practices< / a > < / li >
< li > < a href = "pmd_rules_apex_codestyle.html" > Code Style< / a > < / li >
< li > < a href = "pmd_rules_apex_design.html" > Design< / a > < / li >
< li > < a href = "pmd_rules_apex_documentation.html" > Documentation< / a > < / li >
< li > < a href = "pmd_rules_apex_errorprone.html" > Error Prone< / a > < / li >
< li > < a href = "pmd_rules_apex_performance.html" > Performance< / a > < / li >
< li > < a href = "pmd_rules_apex_security.html" > Security< / a > < / li >
< / ul >
< / li >
2022-04-28 13:34:56 +00:00
< li class = "subfolders" >
< a href = "#" > HTML Rules< / a >
< ul >
< li > < a href = "pmd_rules_html.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_html_bestpractices.html" > Best Practices< / a > < / li >
< / ul >
< / li >
2020-11-14 09:20:07 +00:00
< li class = "subfolders" >
< a href = "#" > Java Rules< / a >
< ul >
< li > < a href = "pmd_rules_java.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_java_bestpractices.html" > Best Practices< / a > < / li >
< li > < a href = "pmd_rules_java_codestyle.html" > Code Style< / a > < / li >
< li > < a href = "pmd_rules_java_design.html" > Design< / a > < / li >
< li > < a href = "pmd_rules_java_documentation.html" > Documentation< / a > < / li >
< li > < a href = "pmd_rules_java_errorprone.html" > Error Prone< / a > < / li >
< li > < a href = "pmd_rules_java_multithreading.html" > Multithreading< / a > < / li >
< li > < a href = "pmd_rules_java_performance.html" > Performance< / a > < / li >
< li > < a href = "pmd_rules_java_security.html" > Security< / a > < / li >
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > Java Server Pages Rules< / a >
< ul >
< li > < a href = "pmd_rules_jsp.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_jsp_bestpractices.html" > Best Practices< / a > < / li >
< li > < a href = "pmd_rules_jsp_codestyle.html" > Code Style< / a > < / li >
< li > < a href = "pmd_rules_jsp_design.html" > Design< / a > < / li >
< li > < a href = "pmd_rules_jsp_errorprone.html" > Error Prone< / a > < / li >
< li > < a href = "pmd_rules_jsp_security.html" > Security< / a > < / li >
< / ul >
< / li >
2023-03-03 20:15:41 +00:00
< li class = "subfolders" >
< a href = "#" > JavaScript Rules< / a >
< ul >
< li > < a href = "pmd_rules_ecmascript.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_ecmascript_bestpractices.html" > Best Practices< / a > < / li >
< li > < a href = "pmd_rules_ecmascript_codestyle.html" > Code Style< / a > < / li >
< li > < a href = "pmd_rules_ecmascript_errorprone.html" > Error Prone< / a > < / li >
2024-08-29 16:28:37 +00:00
< li > < a href = "pmd_rules_ecmascript_performance.html" > Performance< / a > < / li >
2023-03-03 20:15:41 +00:00
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > Kotlin Rules< / a >
< ul >
< li > < a href = "pmd_rules_kotlin.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_kotlin_bestpractices.html" > Best Practices< / a > < / li >
< li > < a href = "pmd_rules_kotlin_errorprone.html" > Error Prone< / a > < / li >
< / ul >
< / li >
2020-11-14 09:20:07 +00:00
< li class = "subfolders" >
< a href = "#" > Maven POM Rules< / a >
< ul >
< li > < a href = "pmd_rules_pom.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_pom_errorprone.html" > Error Prone< / a > < / li >
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > Modelica Rules< / a >
< ul >
< li > < a href = "pmd_rules_modelica.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_modelica_bestpractices.html" > Best Practices< / a > < / li >
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > PLSQL Rules< / a >
< ul >
< li > < a href = "pmd_rules_plsql.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_plsql_bestpractices.html" > Best Practices< / a > < / li >
< li > < a href = "pmd_rules_plsql_codestyle.html" > Code Style< / a > < / li >
< li > < a href = "pmd_rules_plsql_design.html" > Design< / a > < / li >
< li > < a href = "pmd_rules_plsql_errorprone.html" > Error Prone< / a > < / li >
< / ul >
< / li >
< li class = "subfolders" >
2023-10-20 00:49:52 +00:00
< a href = "#" > Salesforce Visualforce Rules< / a >
2020-11-14 09:20:07 +00:00
< ul >
2024-03-04 19:16:42 +00:00
< li > < a href = "pmd_rules_visualforce.html" > Index< / a > < / li >
2020-11-14 09:20:07 +00:00
2024-03-04 19:16:42 +00:00
< li > < a href = "pmd_rules_visualforce_security.html" > Security< / a > < / li >
2020-11-14 09:20:07 +00:00
< / ul >
< / li >
2022-11-18 15:25:16 +00:00
< li class = "subfolders" >
< a href = "#" > Scala Rules< / a >
< ul >
< li > < a href = "pmd_rules_scala.html" > Index< / a > < / li >
< / ul >
< / li >
2023-03-03 20:15:41 +00:00
< li class = "subfolders" >
< a href = "#" > Swift Rules< / a >
< ul >
< li > < a href = "pmd_rules_swift.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_swift_bestpractices.html" > Best Practices< / a > < / li >
< li > < a href = "pmd_rules_swift_errorprone.html" > Error Prone< / a > < / li >
< / ul >
< / li >
2020-11-14 09:20:07 +00:00
< li class = "subfolders" >
2023-10-20 00:49:52 +00:00
< a href = "#" > Velocity Template Language (VTL) Rules< / a >
2020-11-14 09:20:07 +00:00
< ul >
2024-03-04 19:16:42 +00:00
< li > < a href = "pmd_rules_velocity.html" > Index< / a > < / li >
2020-11-14 09:20:07 +00:00
2024-03-04 19:16:42 +00:00
< li > < a href = "pmd_rules_velocity_bestpractices.html" > Best Practices< / a > < / li >
2020-11-14 09:20:07 +00:00
2024-03-04 19:16:42 +00:00
< li > < a href = "pmd_rules_velocity_design.html" > Design< / a > < / li >
2020-11-14 09:20:07 +00:00
2024-03-04 19:16:42 +00:00
< li > < a href = "pmd_rules_velocity_errorprone.html" > Error Prone< / a > < / li >
2020-11-14 09:20:07 +00:00
< / ul >
< / li >
2022-11-18 15:25:16 +00:00
< li class = "subfolders" >
< a href = "#" > WSDL Rules< / a >
< ul >
< li > < a href = "pmd_rules_wsdl.html" > Index< / a > < / li >
< / ul >
< / li >
2020-11-14 09:20:07 +00:00
< li class = "subfolders" >
< a href = "#" > XML Rules< / a >
< ul >
< li > < a href = "pmd_rules_xml.html" > Index< / a > < / li >
2023-10-19 09:25:45 +00:00
< li > < a href = "pmd_rules_xml_bestpractices.html" > Best Practices< / a > < / li >
2020-11-14 09:20:07 +00:00
< li > < a href = "pmd_rules_xml_errorprone.html" > Error Prone< / a > < / li >
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > XSL Rules< / a >
< ul >
< li > < a href = "pmd_rules_xsl.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_xsl_codestyle.html" > Code Style< / a > < / li >
< li > < a href = "pmd_rules_xsl_performance.html" > Performance< / a > < / li >
< / ul >
< / li >
< / ul >
< / li >
< li >
2023-03-03 20:15:41 +00:00
< a href = "#" > Language-Specific Documentation< / a >
2020-11-14 09:20:07 +00:00
< ul >
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_index.html" > Overview< / a > < / li >
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_languages_configuration.html" > Language configuration< / a > < / li >
2020-11-14 09:20:07 +00:00
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_languages_apex.html" > Apex< / a > < / li >
2022-03-27 15:04:13 +00:00
2023-03-03 20:15:41 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_cpp.html" > C/C++< / a > < / li >
< li > < a href = "pmd_languages_cs.html" > C#< / a > < / li >
< li > < a href = "pmd_languages_coco.html" > Coco< / a > < / li >
< li > < a href = "pmd_languages_dart.html" > Dart< / a > < / li >
< li > < a href = "pmd_languages_fortran.html" > Fortran< / a > < / li >
< li > < a href = "pmd_languages_gherkin.html" > Gherkin< / a > < / li >
< li > < a href = "pmd_languages_go.html" > Go< / a > < / li >
< li > < a href = "pmd_languages_html.html" > HTML< / a > < / li >
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_languages_java.html" > Java< / a > < / li >
2022-03-27 15:04:13 +00:00
2023-04-29 14:37:59 +00:00
< li > < a href = "pmd_languages_js_ts.html" > JavaScript / TypeScript< / a > < / li >
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_languages_jsp.html" > JSP< / a > < / li >
2020-11-14 09:20:07 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_julia.html" > Julia< / a > < / li >
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_languages_kotlin.html" > Kotlin< / a > < / li >
2020-11-14 09:20:07 +00:00
2021-03-26 08:22:23 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_lua.html" > Lua< / a > < / li >
< li > < a href = "pmd_languages_matlab.html" > Matlab< / a > < / li >
< li > < a href = "pmd_languages_modelica.html" > Modelica< / a > < / li >
< li > < a href = "pmd_languages_objectivec.html" > Objective-C< / a > < / li >
< li > < a href = "pmd_languages_perl.html" > Perl< / a > < / li >
< li > < a href = "pmd_languages_php.html" > PHP< / a > < / li >
2021-03-26 08:22:23 +00:00
< li > < a href = "pmd_languages_plsql.html" > PLSQL< / a > < / li >
2021-10-29 17:50:40 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_python.html" > Python< / a > < / li >
2022-04-28 13:34:56 +00:00
2022-07-01 07:55:16 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_ruby.html" > Ruby< / a > < / li >
2022-07-01 07:55:16 +00:00
2023-04-29 16:54:57 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_scala.html" > Scala< / a > < / li >
2023-04-29 16:54:57 +00:00
2023-05-19 09:58:17 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_swift.html" > Swift< / a > < / li >
2023-10-20 00:42:49 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_tsql.html" > T-SQL< / a > < / li >
2023-10-20 00:42:49 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_visualforce.html" > Visualforce< / a > < / li >
2024-03-04 19:16:42 +00:00
< li > < a href = "pmd_languages_velocity.html" > Velocity Template Language (VTL)< / a > < / li >
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_xml.html" > XML and XML dialects< / a > < / li >
2023-05-19 09:58:17 +00:00
2020-11-14 09:20:07 +00:00
< / ul >
< / li >
< li >
< a href = "#" > Developer Documentation< / a >
< ul >
< li > < a href = "pmd_devdocs_development.html" > Developer resources< / a > < / li >
< li > < a href = "pmd_devdocs_building.html" > Building PMD from source< / a > < / li >
2024-09-26 14:58:11 +00:00
< li > < a href = "https://github.com/pmd/pmd/blob/main/CONTRIBUTING.md" target = "_blank" > Contributing< / a > < / li >
2020-11-14 09:20:07 +00:00
< li > < a href = "pmd_devdocs_writing_documentation.html" > Writing documentation< / a > < / li >
< li > < a href = "pmd_devdocs_roadmap.html" > Roadmap< / a > < / li >
< li > < a href = "pmd_devdocs_how_pmd_works.html" > How PMD works< / a > < / li >
< li > < a href = "pmd_devdocs_pmdtester.html" > Pmdtester< / a > < / li >
< li > < a href = "pmd_devdocs_rule_deprecation_policy.html" > Rule Deprecation Policy< / a > < / li >
< li class = "subfolders" >
< a href = "#" > Major contributions< / a >
< ul >
2021-08-27 14:58:36 +00:00
< li > < a href = "pmd_devdocs_major_rule_guidelines.html" > Rule Guidelines< / a > < / li >
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_devdocs_major_adding_new_language_javacc.html" > Adding a new language (JavaCC)< / a > < / li >
2020-11-14 09:20:07 +00:00
2023-04-20 15:12:02 +00:00
< li > < a href = "pmd_devdocs_major_adding_new_language_antlr.html" > Adding a new language (ANTLR)< / a > < / li >
2020-11-14 09:20:07 +00:00
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_devdocs_major_adding_new_cpd_language.html" > Adding a new CPD language< / a > < / li >
2020-11-14 09:20:07 +00:00
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > Experimental features< / a >
< ul >
2023-10-20 00:49:52 +00:00
< li > < a href = "tag_experimental.html" > List of experimental Features< / a > < / li >
2020-11-14 09:20:07 +00:00
< / ul >
< / li >
< / ul >
< / li >
< li >
< a href = "#" > Project documentation< / a >
< ul >
< li class = "subfolders" >
< a href = "#" > Trivia about PMD< / a >
< ul >
< li > < a href = "pmd_projectdocs_trivia_news.html" > PMD in the press< / a > < / li >
< li > < a href = "pmd_projectdocs_trivia_products.html" > Products & books related to PMD< / a > < / li >
< li > < a href = "pmd_projectdocs_trivia_similarprojects.html" > Similar projects< / a > < / li >
< li > < a href = "pmd_projectdocs_trivia_meaning.html" > What does 'PMD' mean?< / a > < / li >
< / ul >
< / li >
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_projectdocs_logo.html" > Logo< / a > < / li >
2020-11-14 09:20:07 +00:00
< li > < a href = "pmd_projectdocs_faq.html" > FAQ< / a > < / li >
< li > < a href = "license.html" > License< / a > < / li >
< li > < a href = "pmd_projectdocs_credits.html" > Credits< / a > < / li >
< li > < a href = "pmd_release_notes_old.html" > Old release notes< / a > < / li >
2022-09-30 10:03:06 +00:00
< li > < a href = "pmd_projectdocs_decisions.html" > Decisions< / a > < / li >
2020-11-14 09:20:07 +00:00
< li class = "subfolders" >
< a href = "#" > Project management< / a >
< ul >
2021-04-23 20:35:51 +00:00
< li > < a href = "pmd_projectdocs_committers_infrastructure.html" > Infrastructure< / a > < / li >
2020-11-14 09:20:07 +00:00
< li > < a href = "pmd_projectdocs_committers_releasing.html" > Release process< / a > < / li >
< li > < a href = "pmd_projectdocs_committers_merging_pull_requests.html" > Merging pull requests< / a > < / li >
< li > < a href = "pmd_projectdocs_committers_main_landing_page.html" > Main Landing page< / a > < / li >
< / ul >
< / li >
< / ul >
< / li >
< / ul >
2022-02-25 09:51:51 +00:00
< / div >
2020-11-14 09:20:07 +00:00
2022-02-25 09:51:51 +00:00
<!-- Content Column -->
< div class = "col-md-9" id = "tg-sb-content" >
2022-03-24 11:42:13 +00:00
< header >
< div class = "row" >
< div class = "col-lg-12" >
< a href = "./" role = "button"
>< i class = "fa fa-home fa-lg" > < /i
>< / a >
» Writing XPath rules
< a
target="_blank"
2024-09-26 14:58:11 +00:00
href="https://github.com/pmd/pmd/blob/main/docs/pages/pmd/userdocs/extending/writing_xpath_rules.md"
2023-03-03 20:15:41 +00:00
class="float-right"
2022-03-24 11:42:13 +00:00
role="button"
2023-03-16 10:46:54 +00:00
>< i class = "fab fa-github fa-lg" > < / i > Edit on GitHub< /a
2022-03-24 11:42:13 +00:00
>
< / div >
< / div >
< hr / >
< / header >
< div class = "post-header" >
2020-11-14 09:20:07 +00:00
< h1 class = "post-title-main" > Writing XPath rules< / h1 >
< / div >
2024-09-26 14:58:11 +00:00
< div class = "post-content" data-github-edit-url = "https://github.com/pmd/pmd/blob/main/docs/pages/pmd/userdocs/extending/writing_xpath_rules.md" >
2020-11-14 09:20:07 +00:00
< div class = "summary" > This page describes XPath rule support in more details< / div >
2023-08-22 15:14:23 +00:00
< details id = "inline-toc-details" >
< summary > Table of Contents< / summary >
< div id = "inline-toc" > <!-- empty, move TOC here when screen size too small --> < / div >
< / details >
2023-03-03 20:15:41 +00:00
2020-11-14 09:20:07 +00:00
< p > This page describes some points of XPath rule support in more details. See
2024-01-12 09:15:55 +00:00
also < a href = "pmd_userdocs_extending_your_first_rule.html" > the tutorial about how to write a first (XPath) rule< / a > .< / p >
2020-11-14 09:20:07 +00:00
<!-- Later we can document the specific subset of XPath features our wrappers support -->
< h2 id = "xpath-version" > XPath version< / h2 >
2024-01-12 09:15:55 +00:00
< p > PMD uses XPath 3.1 for its XPath rules since PMD 7. Before then, the default version was XPath 1.0,
with opt-in support for XPath 2.0.< / p >
2020-11-14 09:20:07 +00:00
2024-01-12 09:15:55 +00:00
< p > See < a href = "https://www.saxonica.com/html/documentation/expressions/xpath31new.html" > the Saxonica documentation< / a >
for an introduction to new features in XPath 3.1.< / p >
2020-11-14 09:20:07 +00:00
2024-10-25 08:59:30 +00:00
< p > The property < code class = "language-plaintext highlighter-rouge" > version< / code > of < a href = "https://docs.pmd-code.org/apidocs/pmd-core/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/rule/xpath/XPathRule.html#" > < code > XPathRule< / code > < / a > is deprecated and
2024-02-09 17:22:16 +00:00
has been removed with PMD 7.< / p >
2020-11-14 09:20:07 +00:00
< h2 id = "dom-representation-of-asts" > DOM representation of ASTs< / h2 >
< p > XPath rules view the AST as an XML-like DOM, which is what the XPath language is
defined on. Concretely, this means:< / p >
< ul >
< li > Every AST node is viewed as an XML element
< ul >
2024-10-25 08:59:30 +00:00
< li > The element has for local name the value of < a href = "https://docs.pmd-code.org/apidocs/pmd-core/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/ast/Node.html#getXPathNodeName()" > < code > getXPathNodeName< / code > < / a >
2020-11-14 09:20:07 +00:00
for the given node< / li >
< / ul >
< / li >
< li > Some Java getters are exposed as XML attributes on those elements
< ul >
< li > This means, that documentation for attributes can be found in our Javadocs. For
example, the attribute < code class = "language-plaintext highlighter-rouge" > @SimpleName< / code > of the Java node < code class = "language-plaintext highlighter-rouge" > EnumDeclaration< / code > is backed
2024-10-25 08:59:30 +00:00
by the Java getter < a href = "https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/ASTTypeDeclaration.html#getSimpleName()" > < code > getSimpleName< / code > < / a > .< / li >
2020-11-14 09:20:07 +00:00
< / ul >
< / li >
< / ul >
< h3 id = "value-conversion" > Value conversion< / h3 >
2024-01-12 09:15:55 +00:00
< p > To represent attributes, we must map Java values to < a href = "https://www.w3.org/TR/xpath-datamodel/" > XPath Data Model (XDM)< / a >
values. In the following table we refer to the type conversion function as < code class = "language-plaintext highlighter-rouge" > conv< / code > , a function from Java types
to XDM types.< / p >
2020-11-14 09:20:07 +00:00
< table >
< thead >
< tr >
< th > Java type < code class = "language-plaintext highlighter-rouge" > T< / code > < / th >
< th > XSD type < code class = "language-plaintext highlighter-rouge" > conv(T)< / code > < / th >
< / tr >
< / thead >
< tbody >
< tr >
< td > < code class = "language-plaintext highlighter-rouge" > int< / code > < / td >
< td > < code class = "language-plaintext highlighter-rouge" > xs:integer< / code > < / td >
< / tr >
< tr >
< td > < code class = "language-plaintext highlighter-rouge" > long< / code > < / td >
< td > < code class = "language-plaintext highlighter-rouge" > xs:integer< / code > < / td >
< / tr >
< tr >
< td > < code class = "language-plaintext highlighter-rouge" > double< / code > < / td >
< td > < code class = "language-plaintext highlighter-rouge" > xs:decimal< / code > < / td >
< / tr >
< tr >
< td > < code class = "language-plaintext highlighter-rouge" > float< / code > < / td >
< td > < code class = "language-plaintext highlighter-rouge" > xs:decimal< / code > < / td >
< / tr >
< tr >
< td > < code class = "language-plaintext highlighter-rouge" > boolean< / code > < / td >
< td > < code class = "language-plaintext highlighter-rouge" > xs:boolean< / code > < / td >
< / tr >
< tr >
< td > < code class = "language-plaintext highlighter-rouge" > String< / code > < / td >
< td > < code class = "language-plaintext highlighter-rouge" > xs:string< / code > < / td >
< / tr >
< tr >
< td > < code class = "language-plaintext highlighter-rouge" > Character< / code > < / td >
< td > < code class = "language-plaintext highlighter-rouge" > xs:string< / code > < / td >
< / tr >
< tr >
< td > < code class = "language-plaintext highlighter-rouge" > Enum< E> < / code > < / td >
< td > < code class = "language-plaintext highlighter-rouge" > xs:string< / code > (uses < code class = "language-plaintext highlighter-rouge" > Object::toString< / code > )< / td >
< / tr >
< tr >
2024-05-07 13:48:41 +00:00
< td > < code class = "language-plaintext highlighter-rouge" > Collection< E> < / code > < / td >
2023-03-03 20:15:41 +00:00
< td > < code class = "language-plaintext highlighter-rouge" > conv(E)*< / code > (a sequence type)< / td >
2020-11-14 09:20:07 +00:00
< / tr >
< / tbody >
< / table >
< p > The same < code class = "language-plaintext highlighter-rouge" > conv< / code > function is used to translate rule property values to XDM values.< / p >
2024-05-07 13:48:41 +00:00
< p > Additionaly, PMD’ s own < code class = "language-plaintext highlighter-rouge" > net.sourceforge.pmd.lang.document.Chars< / code > is also translated to a < code class = "language-plaintext highlighter-rouge" > xs:string< / code > < / p >
2020-11-14 09:20:07 +00:00
< h2 id = "rule-properties" > Rule properties< / h2 >
< p > < strong > See < a href = "pmd_userdocs_extending_defining_properties.html#for-xpath-rules" > Defining rule properties< / a > < / strong > < / p >
< h2 id = "pmd-extension-functions" > PMD extension functions< / h2 >
< p > PMD provides some language-specific XPath functions to access semantic
information from the AST.< / p >
2024-01-12 09:15:55 +00:00
< p > The namespace of custom PMD functions must be explicitly mentioned.< / p >
2020-11-14 09:20:07 +00:00
2024-01-12 09:15:55 +00:00
<!-- Generates the documentation of XPath functions from file docs/_data/xpath_funs.yml -->
2020-11-14 09:20:07 +00:00
2022-03-25 07:44:53 +00:00
< h3 id = "all-languages" > All languages< / h3 >
2021-08-22 13:21:24 +00:00
2022-03-25 07:44:53 +00:00
< p > Functions available to all languages are in the namespace < code > pmd< / code > .< / p >
2021-08-22 13:21:24 +00:00
< div class = "table-responsive" >
2024-03-21 10:44:32 +00:00
< table width = "100%" >
2021-08-22 13:21:24 +00:00
2024-03-21 10:44:32 +00:00
< thead >
< tr >
< th > Function name< / th >
< th > Description (click for details)< / th >
< th > < / th >
< / tr >
< / thead >
2021-08-22 13:21:24 +00:00
2024-03-21 10:44:32 +00:00
2021-08-22 13:21:24 +00:00
2024-03-21 10:44:32 +00:00
2021-08-22 13:21:24 +00:00
2024-03-21 10:44:32 +00:00
< tr data-toggle = "collapse" id = "pmd-fileName" data-target = "#pmd-fileName-expand" class = "accordion-toggle" >
< td > fileName< / td >
< td > Returns the simple name of the current file< / td >
< td >
< button type = "button" class = "btn btn-link" > < i class = "fas fa-ellipsis-h" > < / i > < / button >
< / td >
< / tr >
< tr >
< td colspan = "4" class = "hiddenRow" >
< div class = "accordion-body collapse" id = "pmd-fileName-expand" >
< div style = "margin-left: 15px" class = "xpath-fun-doc" >
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!-- links somehow work when details are collapsed -->
< h4 class = "fun-details-header" id = "pmd-fileName" >
< span class = "fun-ns" > pmd:< / span > < span class = "fun-name" > fileName< / span > < span class = "fun-ns" > () as xs:string< / span >
< / h4 >
< div style = "margin-left: 30px" >
< dl >
< dd > Returns the current simple file name, without path but including the extension.
This can be used to write rules that check file naming conventions.
< / dd >
< dt > Since< / dt >
< dd > PMD 6.38.0< / dd >
< dt > Remarks< / dt >
< dd > The requires the context node to be an element< / dd >
< dt > Examples< / dt >
< dd >
< dl class = "code-examples" >
< dt > < code > //b[pmd:fileName() = 'Foo.xml']< / code > < / dt >
< dd > Matches any < code > < b> < / code > tags in files called < code > Foo.xml< / code > .< / dd >
< / dl >
< / dd >
< / dl >
< / div >
< / div >
< / div >
< / td >
< / tr >
2021-08-22 13:21:24 +00:00
2024-03-21 10:44:32 +00:00
2021-08-22 13:21:24 +00:00
2024-03-21 10:44:32 +00:00
2022-03-25 07:44:53 +00:00
2024-03-21 10:44:32 +00:00
< tr data-toggle = "collapse" id = "pmd-startLine" data-target = "#pmd-startLine-expand" class = "accordion-toggle" >
< td > startLine< / td >
< td > Returns the start line of the given node< / td >
< td >
< button type = "button" class = "btn btn-link" > < i class = "fas fa-ellipsis-h" > < / i > < / button >
< / td >
< / tr >
< tr >
< td colspan = "4" class = "hiddenRow" >
< div class = "accordion-body collapse" id = "pmd-startLine-expand" >
< div style = "margin-left: 15px" class = "xpath-fun-doc" >
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!-- links somehow work when details are collapsed -->
< h4 class = "fun-details-header" id = "pmd-startLine" >
< span class = "fun-ns" > pmd:< / span > < span class = "fun-name" > startLine< / span > < span class = "fun-ns" > (xs:element) as xs:int< / span >
< / h4 >
< div style = "margin-left: 30px" >
< dl >
< dd > Returns the line where the node starts in the source file.
Line numbers are 1-based.
< / dd >
< dt > Since< / dt >
< dd > PMD 6.44.0< / dd >
< dt > Remarks< / dt >
< dd > The function is not context-dependent, but takes a node as its first parameter.
< / dd >
< dt > Parameters< / dt >
< dd >
< dl >
< dt >
< span class = "param-name" > element< / span >
< span class = "param-type" > as xs:element< / span >
< / dt >
< dd > Any element node< / dd >
< / dl >
< / dd >
< dt > Examples< / dt >
< dd >
< dl class = "code-examples" >
< dt > < code > //b[pmd:startLine(.) > 5]< / code > < / dt >
< dd > Matches any < code > < b> < / code > node which starts after the fifth line.< / dd >
< / dl >
< / dd >
< / dl >
< / div >
< / div >
< / div >
< / td >
< / tr >
2022-03-25 07:44:53 +00:00
2024-03-21 10:44:32 +00:00
2022-03-25 07:44:53 +00:00
2024-03-21 10:44:32 +00:00
2022-03-25 07:44:53 +00:00
2024-03-21 10:44:32 +00:00
< tr data-toggle = "collapse" id = "pmd-endLine" data-target = "#pmd-endLine-expand" class = "accordion-toggle" >
< td > endLine< / td >
< td > Returns the end line of the given node< / td >
< td >
< button type = "button" class = "btn btn-link" > < i class = "fas fa-ellipsis-h" > < / i > < / button >
< / td >
< / tr >
< tr >
< td colspan = "4" class = "hiddenRow" >
< div class = "accordion-body collapse" id = "pmd-endLine-expand" >
< div style = "margin-left: 15px" class = "xpath-fun-doc" >
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!-- links somehow work when details are collapsed -->
< h4 class = "fun-details-header" id = "pmd-endLine" >
< span class = "fun-ns" > pmd:< / span > < span class = "fun-name" > endLine< / span > < span class = "fun-ns" > (xs:element) as xs:int< / span >
< / h4 >
< div style = "margin-left: 30px" >
< dl >
< dd > Returns the line where the node ends in the source file.
Line numbers are 1-based.
< / dd >
< dt > Since< / dt >
< dd > PMD 6.44.0< / dd >
< dt > Remarks< / dt >
< dd > The function is not context-dependent, but takes a node as its first parameter.
< / dd >
< dt > Parameters< / dt >
< dd >
< dl >
< dt >
< span class = "param-name" > element< / span >
< span class = "param-type" > as xs:element< / span >
< / dt >
< dd > Any element node< / dd >
< / dl >
< / dd >
< dt > Examples< / dt >
< dd >
< dl class = "code-examples" >
< dt > < code > //b[pmd:endLine(.) == pmd:startLine(.)]< / code > < / dt >
< dd > Matches any < code > < b> < / code > node which doesn't span more than one line.< / dd >
< / dl >
< / dd >
< / dl >
< / div >
< / div >
< / div >
< / td >
< / tr >
2022-03-25 07:44:53 +00:00
2024-03-21 10:44:32 +00:00
2022-03-25 07:44:53 +00:00
2024-03-21 10:44:32 +00:00
2022-03-25 07:44:53 +00:00
2024-03-21 10:44:32 +00:00
< tr data-toggle = "collapse" id = "pmd-startColumn" data-target = "#pmd-startColumn-expand" class = "accordion-toggle" >
< td > startColumn< / td >
< td > Returns the start column of the given node (inclusive)< / td >
< td >
< button type = "button" class = "btn btn-link" > < i class = "fas fa-ellipsis-h" > < / i > < / button >
< / td >
< / tr >
< tr >
< td colspan = "4" class = "hiddenRow" >
< div class = "accordion-body collapse" id = "pmd-startColumn-expand" >
< div style = "margin-left: 15px" class = "xpath-fun-doc" >
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!-- links somehow work when details are collapsed -->
< h4 class = "fun-details-header" id = "pmd-startColumn" >
< span class = "fun-ns" > pmd:< / span > < span class = "fun-name" > startColumn< / span > < span class = "fun-ns" > (xs:element) as xs:int< / span >
< / h4 >
< div style = "margin-left: 30px" >
< dl >
< dd > Returns the column number where the node starts in the source file.
Column numbers are 1-based. The start column is inclusive.
< / dd >
< dt > Since< / dt >
< dd > PMD 6.44.0< / dd >
< dt > Remarks< / dt >
< dd > The function is not context-dependent, but takes a node as its first parameter.
< / dd >
< dt > Parameters< / dt >
< dd >
< dl >
< dt >
< span class = "param-name" > element< / span >
< span class = "param-type" > as xs:element< / span >
< / dt >
< dd > Any element node< / dd >
< / dl >
< / dd >
< dt > Examples< / dt >
< dd >
< dl class = "code-examples" >
< dt > < code > //b[pmd:startColumn(.) = 1]< / code > < / dt >
< dd > Matches any < code > < b> < / code > node which starts on the first column of a line< / dd >
< / dl >
< / dd >
< / dl >
< / div >
< / div >
< / div >
< / td >
< / tr >
2022-03-25 07:44:53 +00:00
2024-03-21 10:44:32 +00:00
2022-03-25 07:44:53 +00:00
2024-03-21 10:44:32 +00:00
2022-03-25 07:44:53 +00:00
2024-03-21 10:44:32 +00:00
< tr data-toggle = "collapse" id = "pmd-endColumn" data-target = "#pmd-endColumn-expand" class = "accordion-toggle" >
< td > endColumn< / td >
< td > Returns the end column of the given node (exclusive)< / td >
< td >
< button type = "button" class = "btn btn-link" > < i class = "fas fa-ellipsis-h" > < / i > < / button >
< / td >
< / tr >
< tr >
< td colspan = "4" class = "hiddenRow" >
< div class = "accordion-body collapse" id = "pmd-endColumn-expand" >
< div style = "margin-left: 15px" class = "xpath-fun-doc" >
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!-- links somehow work when details are collapsed -->
< h4 class = "fun-details-header" id = "pmd-endColumn" >
< span class = "fun-ns" > pmd:< / span > < span class = "fun-name" > endColumn< / span > < span class = "fun-ns" > (xs:element) as xs:int< / span >
< / h4 >
< div style = "margin-left: 30px" >
< dl >
< dd > Returns the column number where the node ends in the source file.
Column numbers are 1-based. The end column is exclusive.
< / dd >
< dt > Since< / dt >
< dd > PMD 6.44.0< / dd >
< dt > Remarks< / dt >
< dd > The function is not context-dependent, but takes a node as its first parameter.
< / dd >
< dt > Parameters< / dt >
< dd >
< dl >
< dt >
< span class = "param-name" > element< / span >
< span class = "param-type" > as xs:element< / span >
< / dt >
< dd > Any element node< / dd >
< / dl >
< / dd >
< dt > Examples< / dt >
< dd >
< dl class = "code-examples" >
< dt > < code > //b[pmd:startLine(.) = pmd:endLine(.) and pmd:endColumn(.) - pmd:startColumn(.) = 1]< / code > < / dt >
< dd > Matches any < code > < b> < / code > node which spans exactly one character< / dd >
< / dl >
< / dd >
< / dl >
< / div >
< / div >
< / div >
< / td >
< / tr >
2022-03-25 07:44:53 +00:00
2024-03-21 10:44:32 +00:00
2022-03-25 07:44:53 +00:00
2024-03-21 10:44:32 +00:00
< / table >
2021-08-22 13:21:24 +00:00
< / div >
2024-01-12 09:15:55 +00:00
<!-- Generates the documentation of XPath functions from file docs/_data/xpath_funs.yml -->
2021-08-22 13:21:24 +00:00
2020-11-14 09:20:07 +00:00
< h3 id = "java" > Java< / h3 >
< p > Java functions are in the namespace < code class = "language-plaintext highlighter-rouge" > pmd-java< / code > .< / p >
< div class = "table-responsive" >
2024-03-21 10:44:32 +00:00
< table width = "100%" >
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
< thead >
< tr >
< th > Function name< / th >
< th > Description (click for details)< / th >
< th > < / th >
< / tr >
< / thead >
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
2020-11-14 09:20:07 +00:00
2024-03-21 10:44:32 +00:00
2020-11-14 09:20:07 +00:00
2024-03-21 10:44:32 +00:00
< tr data-toggle = "collapse" id = "pmd-java-nodeIs" data-target = "#pmd-java-nodeIs-expand" class = "accordion-toggle" >
< td > nodeIs< / td >
< td > Tests the runtime type of the node instance< / td >
< td >
< button type = "button" class = "btn btn-link" > < i class = "fas fa-ellipsis-h" > < / i > < / button >
< / td >
< / tr >
< tr >
< td colspan = "4" class = "hiddenRow" >
< div class = "accordion-body collapse" id = "pmd-java-nodeIs-expand" >
< div style = "margin-left: 15px" class = "xpath-fun-doc" >
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!-- links somehow work when details are collapsed -->
< h4 class = "fun-details-header" id = "pmd-java-nodeIs" >
< span class = "fun-ns" > pmd-java:< / span > < span class = "fun-name" > nodeIs< / span > < span class = "fun-ns" > (xs:string) as xs:boolean< / span >
< / h4 >
< div style = "margin-left: 30px" >
< dl >
< dd > Returns true if the runtime type of the AST node is a subtype of the given class. Contrary to typeIs, this tests the type of the AST node. For example, the AST node for a literal (e.g. < code > 5d< / code > ) has type ASTNumericLiteral, and this function will ignore the static type of the expression (double)< / dd >
< dt > Remarks< / dt >
< dd > < / dd >
< dt > Parameters< / dt >
< dd >
< dl >
< dt >
< span class = "param-name" > nodeClassName< / span >
< span class = "param-type" > as xs:string< / span >
< / dt >
2024-10-25 08:59:30 +00:00
< dd > Simple name of a class or interface in package < a href = "https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/package-summary.html#" > < code > net.sourceforge.pmd.lang.java.ast< / code > < / a > , without the 'AST' prefix< / dd >
2024-03-21 10:44:32 +00:00
< / dl >
< / dd >
< dt > Examples< / dt >
< dd >
< dl class = "code-examples" >
< dt > < code > //*[pmd-java:nodeIs("Expression")]< / code > < / dt >
2024-10-25 08:59:30 +00:00
< dd > Matches all nodes that implement < a href = "https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/ASTExpression.html#" > < code > ASTExpression< / code > < / a > < / dd >
2024-03-21 10:44:32 +00:00
< dt > < code > //*[pmd-java:nodeIs("TypeDeclaration")]< / code > < / dt >
2024-10-25 08:59:30 +00:00
< dd > Matches all nodes that implement < a href = "https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/ASTTypeDeclaration.html#" > < code > ASTTypeDeclaration< / code > < / a > < / dd >
2024-03-21 10:44:32 +00:00
< dt > < code > //*[pmd-java:nodeIs("Foo")]< / code > < / dt >
< dd > Runtime error, there's no class ASTFoo in the package< / dd >
< / dl >
< / dd >
< / dl >
< / div >
< / div >
< / div >
< / td >
< / tr >
2020-11-14 09:20:07 +00:00
2024-03-21 10:44:32 +00:00
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
< tr data-toggle = "collapse" id = "pmd-java-typeIs" data-target = "#pmd-java-typeIs-expand" class = "accordion-toggle" >
< td > typeIs< / td >
< td > Tests a node's static type< / td >
< td >
< button type = "button" class = "btn btn-link" > < i class = "fas fa-ellipsis-h" > < / i > < / button >
< / td >
< / tr >
< tr >
< td colspan = "4" class = "hiddenRow" >
< div class = "accordion-body collapse" id = "pmd-java-typeIs-expand" >
< div style = "margin-left: 15px" class = "xpath-fun-doc" >
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!-- links somehow work when details are collapsed -->
< h4 class = "fun-details-header" id = "pmd-java-typeIs" >
< span class = "fun-ns" > pmd-java:< / span > < span class = "fun-name" > typeIs< / span > < span class = "fun-ns" > (xs:string) as xs:boolean< / span >
< / h4 >
< div style = "margin-left: 30px" >
< dl >
< dd > Returns true if the context node's static Java type is a subtype of the given type. This tests for the resolved type of the Java construct, not the type of the AST node. For example, the AST node for a literal (e.g. < code > 5d< / code > ) has type ASTNumericLiteral, however this function will compare the type of the literal (eg here, < code > double< / code > ) against the argument.< / dd >
< dt > Remarks< / dt >
2024-10-25 08:59:30 +00:00
< dd > The context node must be a < a href = "https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/TypeNode.html#" > < code > TypeNode< / code > < / a > < / dd >
2024-03-21 10:44:32 +00:00
< dt > Parameters< / dt >
< dd >
< dl >
< dt >
< span class = "param-name" > javaQualifiedName< / span >
< span class = "param-type" > as xs:string< / span >
< / dt >
< dd > The qualified name of a Java class, possibly with pairs of brackets to indicate an array type. Can also be a primitive type name.< / dd >
< / dl >
< / dd >
< dt > Examples< / dt >
< dd >
< dl class = "code-examples" >
< dt > < code > //FormalParameter[pmd-java:typeIs("java.lang.String[]")]< / code > < / dt >
< dd > Matches formal parameters of type < code > String[]< / code > (including vararg parameters)< / dd >
< dt > < code > //VariableId[pmd-java:typeIs("java.lang.List")]< / code > < / dt >
< dd > Matches variable declarators of type < code > List< / code > or any of its subtypes (including e.g. < code > ArrayList< / code > )< / dd >
< / dl >
< / dd >
< / dl >
< / div >
< / div >
< / div >
< / td >
< / tr >
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
< tr data-toggle = "collapse" id = "pmd-java-typeIsExactly" data-target = "#pmd-java-typeIsExactly-expand" class = "accordion-toggle" >
< td > typeIsExactly< / td >
< td > Tests a node's static type, ignoring subtypes< / td >
< td >
< button type = "button" class = "btn btn-link" > < i class = "fas fa-ellipsis-h" > < / i > < / button >
< / td >
< / tr >
< tr >
< td colspan = "4" class = "hiddenRow" >
< div class = "accordion-body collapse" id = "pmd-java-typeIsExactly-expand" >
< div style = "margin-left: 15px" class = "xpath-fun-doc" >
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!-- links somehow work when details are collapsed -->
< h4 class = "fun-details-header" id = "pmd-java-typeIsExactly" >
< span class = "fun-ns" > pmd-java:< / span > < span class = "fun-name" > typeIsExactly< / span > < span class = "fun-ns" > (xs:string) as xs:boolean< / span >
< / h4 >
< div style = "margin-left: 30px" >
< dl >
< dd > Returns true if the context node's static type is exactly the given type. In particular, returns false if the context node's type is a subtype of the given type.< / dd >
< dt > Remarks< / dt >
2024-10-25 08:59:30 +00:00
< dd > The context node must be a < a href = "https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/TypeNode.html#" > < code > TypeNode< / code > < / a > < / dd >
2024-03-21 10:44:32 +00:00
< dt > Parameters< / dt >
< dd >
< dl >
< dt >
< span class = "param-name" > javaQualifiedName< / span >
< span class = "param-type" > as xs:string< / span >
< / dt >
< dd > The qualified name of a Java class, possibly with pairs of brackets to indicate an array type. Can also be a primitive type name.< / dd >
< / dl >
< / dd >
< dt > Examples< / dt >
< dd >
< dl class = "code-examples" >
< dt > < code > //VariableId[pmd-java:typeIsExactly("java.lang.List")]< / code > < / dt >
< dd > Matches variable declarators of type < code > List< / code > (but not e.g. < code > ArrayList< / code > )< / dd >
< / dl >
< / dd >
< / dl >
< / div >
< / div >
< / div >
< / td >
< / tr >
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
< tr data-toggle = "collapse" id = "pmd-java-metric" data-target = "#pmd-java-metric-expand" class = "accordion-toggle" >
< td > metric< / td >
< td > Computes and returns the value of a metric< / td >
< td >
< button type = "button" class = "btn btn-link" > < i class = "fas fa-ellipsis-h" > < / i > < / button >
< / td >
< / tr >
< tr >
< td colspan = "4" class = "hiddenRow" >
< div class = "accordion-body collapse" id = "pmd-java-metric-expand" >
< div style = "margin-left: 15px" class = "xpath-fun-doc" >
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!-- links somehow work when details are collapsed -->
< h4 class = "fun-details-header" id = "pmd-java-metric" >
< span class = "fun-ns" > pmd-java:< / span > < span class = "fun-name" > metric< / span > < span class = "fun-ns" > (xs:string) as xs:decimal?< / span >
< / h4 >
< div style = "margin-left: 30px" >
< dl >
< dd > Returns the value of the metric as evaluated on the context node. If the metric cannot be computed on that node, returns an empty sequence (which is falsy).< / dd >
< dt > Remarks< / dt >
< dd > < / dd >
< dt > Parameters< / dt >
< dd >
< dl >
< dt >
< span class = "param-name" > metricKey< / span >
< span class = "param-type" > as xs:string< / span >
< / dt >
2024-10-25 08:59:30 +00:00
< dd > The name of a metric in < a href = "https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/metrics/JavaMetrics.html#" > < code > JavaMetrics< / code > < / a > (or an alias thereof).< / dd >
2024-03-21 10:44:32 +00:00
< / dl >
< / dd >
< dt > Examples< / dt >
< dd >
< dl class = "code-examples" >
< dt > < code > //ClassDeclaration[metric('NCSS') > 200]< / code > < / dt >
< dd > < / dd >
< dt > < code > //MethodDeclaration[metric('CYCLO') > 10 and metric('NCSS') > 20]< / code > < / dt >
< dd > < / dd >
< dt > < code > //TypeParameter[metric('idontexist') > 50]< / code > < / dt >
< dd > Error: no such metric< / dd >
< / dl >
< / dd >
< / dl >
< / div >
< / div >
< / div >
< / td >
< / tr >
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
< tr data-toggle = "collapse" id = "pmd-java-hasAnnotation" data-target = "#pmd-java-hasAnnotation-expand" class = "accordion-toggle" >
< td > hasAnnotation< / td >
< td > Tests whether an annotation is present on the node< / td >
< td >
< button type = "button" class = "btn btn-link" > < i class = "fas fa-ellipsis-h" > < / i > < / button >
< / td >
< / tr >
< tr >
< td colspan = "4" class = "hiddenRow" >
< div class = "accordion-body collapse" id = "pmd-java-hasAnnotation-expand" >
< div style = "margin-left: 15px" class = "xpath-fun-doc" >
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!-- links somehow work when details are collapsed -->
< h4 class = "fun-details-header" id = "pmd-java-hasAnnotation" >
< span class = "fun-ns" > pmd-java:< / span > < span class = "fun-name" > hasAnnotation< / span > < span class = "fun-ns" > (xs:string) as xs:boolean< / span >
< / h4 >
< div style = "margin-left: 30px" >
< dl >
< dd > Returns true if the node has an annotation with the given qualified name< / dd >
< dt > Remarks< / dt >
2024-10-25 08:59:30 +00:00
< dd > The context node must be an < a href = "https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/Annotatable.html#" > < code > Annotatable< / code > < / a > , otherwise this returns false< / dd >
2024-03-21 10:44:32 +00:00
< dt > Parameters< / dt >
< dd >
< dl >
< dt >
< span class = "param-name" > annotationClassName< / span >
< span class = "param-type" > as xs:string< / span >
< / dt >
< dd > Canonical name of an annotation type< / dd >
< / dl >
< / dd >
< dt > Examples< / dt >
< dd >
< dl class = "code-examples" >
< dt > < code > //MethodDeclaration[pmd-java:hasAnnotation("java.lang.Override")]< / code > < / dt >
< dd > Matches all method declarations that are annotated with @Override< / dd >
< / dl >
< / dd >
< / dl >
< / div >
< / div >
< / div >
< / td >
< / tr >
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
< tr data-toggle = "collapse" id = "pmd-java-modifiers" data-target = "#pmd-java-modifiers-expand" class = "accordion-toggle" >
< td > modifiers< / td >
< td > Produce the effective modifiers of a node< / td >
< td >
< button type = "button" class = "btn btn-link" > < i class = "fas fa-ellipsis-h" > < / i > < / button >
< / td >
< / tr >
< tr >
< td colspan = "4" class = "hiddenRow" >
< div class = "accordion-body collapse" id = "pmd-java-modifiers-expand" >
< div style = "margin-left: 15px" class = "xpath-fun-doc" >
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!-- links somehow work when details are collapsed -->
< h4 class = "fun-details-header" id = "pmd-java-modifiers" >
< span class = "fun-ns" > pmd-java:< / span > < span class = "fun-name" > modifiers< / span > < span class = "fun-ns" > () as xs:string*< / span >
< / h4 >
< div style = "margin-left: 30px" >
< dl >
2024-10-25 08:59:30 +00:00
< dd > Returns a sequence of the effective modifiers of a node as strings. This is documented on < a href = "https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/ASTModifierList.html#getEffectiveModifiers()" > < code > getEffectiveModifiers< / code > < / a > .< / dd >
2024-03-21 10:44:32 +00:00
< dt > Remarks< / dt >
2024-10-25 08:59:30 +00:00
< dd > The context node must be an < a href = "https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/ModifierOwner.html#" > < code > ModifierOwner< / code > < / a > , otherwise this returns an empty sequence< / dd >
2024-03-21 10:44:32 +00:00
< dt > Examples< / dt >
< dd >
< dl class = "code-examples" >
< dt > < code > //MethodDeclaration[pmd-java:modifiers() = "native"]< / code > < / dt >
< dd > Matches native method declarations< / dd >
< dt > < code > //MethodDeclaration[pmd-java:modifiers() = ("native", "static")]< / code > < / dt >
< dd > Matches method declarations that have a 'native' OR a 'static' modifier. This may be counter-intuitive.< / dd >
< dt > < code > //MethodDeclaration[pmd-java:modifiers() = "public"]< / code > < / dt >
< dd > Matches method declarations that have a 'public' modifier, explicit or implicit. For example, this would match methods in interfaces, which implicitly have the modifier. Use the < code > explicitModifiers< / code > function if you don't want the implicit part. Also note that < code > @Visibility = 'public'< / code > is a better use of the API, in this particular instance.< / dd >
< / dl >
< / dd >
< / dl >
< / div >
< / div >
< / div >
< / td >
< / tr >
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
< tr data-toggle = "collapse" id = "pmd-java-explicitModifiers" data-target = "#pmd-java-explicitModifiers-expand" class = "accordion-toggle" >
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
< td > explicitModifiers< / td >
< td > Produce the explicit modifiers of a node< / td >
< td >
< button type = "button" class = "btn btn-link" > < i class = "fas fa-ellipsis-h" > < / i > < / button >
< / td >
< / tr >
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
< tr >
< td colspan = "4" class = "hiddenRow" >
< div class = "accordion-body collapse" id = "pmd-java-explicitModifiers-expand" >
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
< div style = "margin-left: 15px" class = "xpath-fun-doc" >
2023-03-03 20:15:41 +00:00
2024-03-21 10:44:32 +00:00
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!-- links somehow work when details are collapsed -->
< h4 class = "fun-details-header" id = "pmd-java-explicitModifiers" >
< span class = "fun-ns" > pmd-java:< / span > < span class = "fun-name" > explicitModifiers< / span > < span class = "fun-ns" > () as xs:string*< / span >
< / h4 >
2020-11-14 09:20:07 +00:00
2024-03-21 10:44:32 +00:00
< div style = "margin-left: 30px" >
2020-11-14 09:20:07 +00:00
2024-03-21 10:44:32 +00:00
< dl >
2024-10-25 08:59:30 +00:00
< dd > Returns a sequence of the explicit modifiers of a node as strings. This is documented on < a href = "https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/ASTModifierList.html#getExplicitModifiers()" > < code > getExplicitModifiers< / code > < / a > .< / dd >
2024-03-21 10:44:32 +00:00
< dt > Remarks< / dt >
2024-10-25 08:59:30 +00:00
< dd > The context node must be an < a href = "https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/ModifierOwner.html#" > < code > ModifierOwner< / code > < / a > , otherwise this returns an empty sequence< / dd >
2024-03-21 10:44:32 +00:00
< dt > Examples< / dt >
< dd >
< dl class = "code-examples" >
< dt > < code > //MethodDeclaration[pmd-java:explicitModifiers() = "public"]< / code > < / dt >
< dd > Matches method declarations that have an explicit 'public' modifier.< / dd >
< / dl >
< / dd >
< / dl >
< / div >
< / div >
< / div >
< / td >
< / tr >
< tr data-toggle = "collapse" id = "pmd-java-matchesSig" data-target = "#pmd-java-matchesSig-expand" class = "accordion-toggle" >
< td > matchesSig< / td >
< td > Matches the signature called by a method or constructor call< / td >
< td >
< button type = "button" class = "btn btn-link" > < i class = "fas fa-ellipsis-h" > < / i > < / button >
< / td >
< / tr >
< tr >
< td colspan = "4" class = "hiddenRow" >
< div class = "accordion-body collapse" id = "pmd-java-matchesSig-expand" >
< div style = "margin-left: 15px" class = "xpath-fun-doc" >
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!-- links somehow work when details are collapsed -->
< h4 class = "fun-details-header" id = "pmd-java-matchesSig" >
< span class = "fun-ns" > pmd-java:< / span > < span class = "fun-name" > matchesSig< / span > < span class = "fun-ns" > (xs:string) as xs:boolean< / span >
< / h4 >
< div style = "margin-left: 30px" >
< dl >
2024-10-25 08:59:30 +00:00
< dd > Uses an < a href = "https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/types/TypeTestUtil.InvocationMatcher.html#" > < code > TypeTestUtil.InvocationMatcher< / code > < / a > to test the method signature called by the context node. The format of the parameter is described on that class.< / dd >
2024-03-21 10:44:32 +00:00
< dt > Remarks< / dt >
2024-10-25 08:59:30 +00:00
< dd > The context node must be an < a href = "https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/InvocationNode.html#" > < code > InvocationNode< / code > < / a > , otherwise this returns false< / dd >
2024-03-21 10:44:32 +00:00
< dt > Parameters< / dt >
< dd >
< dl >
< dt >
< span class = "param-name" > sig< / span >
< span class = "param-type" > as xs:string< / span >
< / dt >
2024-10-25 08:59:30 +00:00
< dd > A signature, in the format described on < a href = "https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/types/TypeTestUtil.InvocationMatcher.html#" > < code > TypeTestUtil.InvocationMatcher< / code > < / a > < / dd >
2024-03-21 10:44:32 +00:00
< / dl >
< / dd >
< dt > Examples< / dt >
< dd >
< dl class = "code-examples" >
< dt > < code > //MethodCall[pmd-java:matchesSig("_#equals(java.lang.Object)")]< / code > < / dt >
< dd > Matches calls to the method < code > equals< / code > on any receiver type< / dd >
< dt > < code > //MethodCall[pmd-java:matchesSig("java.lang.Enum#equals(java.lang.Object)")]< / code > < / dt >
< dd > Matches calls to the method < code > equals< / code > on receiver that is a subtype of Enum< / dd >
< dt > < code > //MethodCall[pmd-java:matchesSig("java.lang.String#toString()")]< / code > < / dt >
< dd > Matches calls to the method < code > toString< / code > on String receivers< / dd >
< dt > < code > //MethodCall[pmd-java:matchesSig("_#_(int,int)")]< / code > < / dt >
< dd > Matches calls to any method with 2 < code > int< / code > parameters (!= argument)< / dd >
< dt > < code > //ConstructorCall[pmd-java:matchesSig("java.util.ArrayList#new(int)")]< / code > < / dt >
< dd > Matches constructors calls of ArrayList with a single int parameter< / dd >
< / dl >
< / dd >
< / dl >
< / div >
< / div >
< / div >
< / td >
< / tr >
2020-11-14 09:20:07 +00:00
2024-03-21 10:44:32 +00:00
< / table >
2020-11-14 09:20:07 +00:00
< / div >
< div class = "tags" >
< b > Tags: < / b >
2023-03-03 20:15:41 +00:00
< a href = "tag_extending.html" class = "btn btn-outline-secondary navbar-btn cursorNorm" role = "button" > extending< / a >
2020-11-14 09:20:07 +00:00
2023-03-03 20:15:41 +00:00
< a href = "tag_userdocs.html" class = "btn btn-outline-secondary navbar-btn cursorNorm" role = "button" > userdocs< / a >
2020-11-14 09:20:07 +00:00
< / div >
< / div >
< footer >
2022-03-24 11:42:13 +00:00
< hr / >
< div >
This documentation is written in markdown. < br / >
If there is something missing or can be improved, edit this page on
github and create a PR:
< a
target="_blank"
2024-09-26 14:58:11 +00:00
href="https://github.com/pmd/pmd/blob/main/docs/pages/pmd/userdocs/extending/writing_xpath_rules.md"
2022-03-24 11:42:13 +00:00
role="button"
2023-04-19 03:50:18 +00:00
>< i class = "fab fa-github fa-lg" > < / i > Edit on GitHub< /a
2022-03-24 11:42:13 +00:00
>
< / div >
< hr / >
< div class = "row" >
< div class = "col-lg-12 footer" >
2024-01-05 14:22:28 +00:00
© 2024 PMD Open Source Project. All rights
2022-03-24 11:42:13 +00:00
reserved. < br / >
< span > Page last updated:< / span >
2024-11-21 14:49:47 +00:00
December 2023 (7.0.0)< br / > Site last generated: Nov 21, 2024 < br / >
2022-03-24 11:42:13 +00:00
< p >
2023-03-03 20:15:41 +00:00
< img src = "images/logo/pmd-logo-70px.png" alt = "PMD
2022-03-24 11:42:13 +00:00
logo"/>
< / p >
< / div >
< / div >
2020-11-14 09:20:07 +00:00
< / footer >
2022-02-25 09:51:51 +00:00
< / div >
<!-- /.row -->
2020-11-14 09:20:07 +00:00
< / div >
2022-02-25 09:51:51 +00:00
<!-- /.container -->
< / div >
<!-- Sticky TOC column -->
< div class = "toc-col" >
2022-03-24 11:42:13 +00:00
< div id = "toc" > < / div >
2020-11-14 09:20:07 +00:00
< / div >
2022-02-25 09:51:51 +00:00
<!-- /.toc - container - wrapper -->
2020-11-14 09:20:07 +00:00
< / div >
< / div >
2023-03-03 20:15:41 +00:00
< script type = "application/javascript" src = "assets/jquery-3.5.1/jquery-3.5.1.min.js" > < / script >
< script type = "application/javascript" src = "assets/anchorjs-4.2.2/anchor.min.js" > < / script >
< script type = "application/javascript" src = "assets/navgoco-0.2.1/src/jquery.navgoco.min.js" > < / script >
< script type = "application/javascript" src = "assets/bootstrap-4.5.2-dist/js/bootstrap.bundle.min.js" > < / script >
< script type = "application/javascript" src = "assets/Simple-Jekyll-Search-1.0.8/dest/jekyll-search.js" > < / script >
< script type = "application/javascript" src = "assets/jekyll-table-of-contents/toc.js" > < / script >
< script type = "application/javascript" src = "js/tabstate.js" > < / script >
< script type = "application/javascript" src = "js/customscripts.js" > < / script >
< / body >
2020-11-14 09:20:07 +00:00
< / html >