# Performance

Rules that flag suboptimal code.

## AvoidAxisNavigation

Since: PMD 5.0

Priority: Medium (3)

Avoid using the ‘following’ or ‘preceding’ axes whenever possible, as these can cut through 100% of the document in the worst case. Also, try to avoid using ‘descendant’ or ‘descendant-or-self’ axes, as if you’re at the top of the Document, it necessarily means cutting through 100% of the document.

This rule is defined by the following XPath expression:

    //node()[
      contains(@select,'preceding::')
      or
      contains(@select,'following::')
      or
      contains(@select,'descendant::')
      or
      contains(@select,'descendant-self::')
      or (
        ($checkSelfDescendantAbreviation = true() )
        and
        contains(@select,'//')
        )
    ]

Example(s):

    <xsl:variable name="var" select="//item/descendant::child"/>

This rule has the following properties:

Name | Default Value | Description | Multivalued
--- | --- | --- | ---
checkSelfDescendantAbreviation | false | descendant::self abreviation, ‘//’, will also trigger this rule. | no

Use this rule with the default properties by just referencing it:

    <rule ref="category/xsl/performance.xml/AvoidAxisNavigation" />

Use this rule and customize it:

    <rule ref="category/xsl/performance.xml/AvoidAxisNavigation">
        <properties>
            <property name="checkSelfDescendantAbreviation" value="false" />
        </properties>
    </rule>