docs: public void assign(Identifier id)
    {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        tc.entry(
          cclass,
          "assign",
          "identifier: " + id);
      
      // Assign ordinal position
      String key = null;
      switch (id.getType()) 
      {
        case Identifier.STRING :
          // Changed from using the Identifier name to using the full name under defect 504438. The full name is only
          // relevant in the XPath Selector Domain and incorporates the full path for the attribute or element referenced.
          // This is necessary so that we are able to distinguish between common names at the same depth in an XML
          // document. For example you might encounter 2 XPath expressions:
          //
          // /company/department[@name='test'] and /company/location[@name='London']
          //
          // We must ensure that the system can distinguish these attributes.
          //
          key = "S:" + id.getFullName();
          break;
        case Identifier.BOOLEAN :
          key = "B:" + id.getFullName();
          break;
        case Identifier.CHILD :
          key = "C:" + id.getFullName();
          break;
        case Identifier.TOPIC:
          key = "T:" + id.getFullName();
          break;
        case Identifier.UNKNOWN :
        case Identifier.OBJECT :
          key = "U:" + id.getFullName();
          break;
        default :
          key = "N:" + id.getFullName();
      }
   
      // Get the map for the specified level. The level is only relevant in the XPath Selector Domain. It represents the
      // level of a location step in an XPath expression
      Integer level = new Integer(id.getStep());
      LevelEntry positions = (LevelEntry) levels.get(level);
      if (positions == null)
      {
        positions = new LevelEntry();
        levels.put(level, positions);
      }
      
      int levelPos = 0;
      if (key != null)
      {
        levelPos = positions.getPosition(key);
      }
      
      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
        tc.debug(this,cclass, "assign", "level: " + level + ", levelPos: " + Integer.valueOf(levelPos) + ", for key: " + key);   
      
      // Now we're ready to set the OrdinalPosition
      OrdinalPosition ordPos = new OrdinalPosition(level.intValue(), levelPos);
      id.setOrdinalPosition(ordPos);
      
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        tc.exit(this,cclass, "assign");
    }