docs: protected void exportNode( Node node,
                                 ContentHandler contentHandler,
                                 boolean skipBinary,
                                 boolean noRecurse,
                                 boolean isRoot ) throws RepositoryException, SAXException {
          // start the sv:node element for this JCR node
          AttributesImpl atts = new AttributesImpl();
          String nodeName = node.getName();
          if (isRoot && node.getDepth() == 0) {
              // This is the root node ...
              nodeName = "jcr:root";
          }
          atts.addAttribute(JcrSvLexicon.NAME.getNamespaceUri(),
                            JcrSvLexicon.NAME.getLocalName(),
                            getPrefixedName(JcrSvLexicon.NAME),
                            org.modeshape.jcr.api.PropertyType.nameFromValue(PropertyType.STRING),
                            nodeName);
  
          startElement(contentHandler, JcrSvLexicon.NODE, atts);
  
          JcrSharedNode sharedNode = asSharedNode(node);
          if (sharedNode != null) {
              // This is a shared node, and per Section 14.7 of the JCR 2.0 specification, they have to be written out
              // in a special way ...
  
              // jcr:primaryType = nt:share ...
              emitProperty(JcrLexicon.PRIMARY_TYPE, PropertyType.NAME, JcrNtLexicon.SHARE, contentHandler, skipBinary);
  
              // jcr:uuid = UUID of shared node ...
              emitProperty(JcrLexicon.UUID, PropertyType.STRING, sharedNode.getIdentifier(), contentHandler, skipBinary);
          } else {
              exporting(node);
              // Output any special properties first (see Javadoc for SPECIAL_PROPERTY_NAMES for more context)
              for (Name specialPropertyName : SPECIAL_PROPERTY_NAMES) {
                  Property specialProperty = ((AbstractJcrNode)node).getProperty(specialPropertyName);
  
                  if (specialProperty != null) {
                      emitProperty(specialProperty, contentHandler, skipBinary);
                  }
              }
  
              PropertyIterator properties = node.getProperties();
              while (properties.hasNext()) {
                  exportProperty(properties.nextProperty(), contentHandler, skipBinary);
              }
  
              if (!noRecurse) {
                  // the node iterator should check permissions and return only those nodes on which there is READ permission
                  NodeIterator nodes = node.getNodes();
                  while (nodes.hasNext()) {
                      Node child = nodes.nextNode();
                      //MODE-2171 Ignore any ACL nodes
                      if (!child.isNodeType(ModeShapeLexicon.ACCESS_LIST_NODE_TYPE_STRING)) {
                          exportNode(child, contentHandler, skipBinary, noRecurse, false);
                      }
                  }
              }
          }
  
          endElement(contentHandler, JcrSvLexicon.NODE);
      }