コード例 #1
0
ファイル: KeyIndex.java プロジェクト: napile/napile.classpath
  /**
   * Given a context node and the argument to the XPath <code>id</code> function, checks whether the
   * context node is in the set of nodes that results from that reference to the <code>id</code>
   * function. This is used in the implementation of <code>id</code> patterns.
   *
   * @param node The context node
   * @param value The argument to the <code>id</code> function
   * @return <code>1</code> if the context node is in the set of nodes returned by the reference to
   *     the <code>id</code> function; <code>0</code>, otherwise
   */
  public int containsID(int node, Object value) {
    final String string = (String) value;
    int rootHandle = _dom.getAxisIterator(Axis.ROOT).setStartNode(node).next();

    // Get the mapping table for the document containing the context node
    Hashtable index = (Hashtable) _rootToIndexMap.get(new Integer(rootHandle));

    // Split argument to id function into XML whitespace separated tokens
    final StringTokenizer values = new StringTokenizer(string, " \n\t");

    while (values.hasMoreElements()) {
      final String token = (String) values.nextElement();
      IntegerArray nodes = null;

      if (index != null) {
        nodes = (IntegerArray) index.get(token);
      }

      // If input was from W3C DOM, use DOM's getElementById to do
      // the look-up.
      if (nodes == null && _enhancedDOM != null && _enhancedDOM.hasDOMSource()) {
        nodes = getDOMNodeById(token);
      }

      // Did we find the context node in the set of nodes?
      if (nodes != null && nodes.indexOf(node) >= 0) {
        return 1;
      }
    }

    // Didn't find the context node in the set of nodes returned by id
    return 0;
  }
コード例 #2
0
ファイル: KeyIndex.java プロジェクト: napile/napile.classpath
  /**
   * Return an IntegerArray for the DOM Node which has the given id.
   *
   * @param id The id
   * @return A IntegerArray representing the Node whose id is the given value.
   */
  public IntegerArray getDOMNodeById(String id) {
    IntegerArray nodes = null;

    if (_enhancedDOM != null) {
      int ident = _enhancedDOM.getElementById(id);

      if (ident != DTM.NULL) {
        Integer root = new Integer(_enhancedDOM.getDocument());
        Hashtable index = (Hashtable) _rootToIndexMap.get(root);

        if (index == null) {
          index = new Hashtable();
          _rootToIndexMap.put(root, index);
        } else {
          nodes = (IntegerArray) index.get(id);
        }

        if (nodes == null) {
          nodes = new IntegerArray();
          index.put(id, nodes);
        }

        nodes.add(_enhancedDOM.getNodeHandle(ident));
      }
    }

    return nodes;
  }
コード例 #3
0
ファイル: KeyIndex.java プロジェクト: napile/napile.classpath
  /**
   * Given a context node and the second argument to the XSLT <code>key</code> function, checks
   * whether the context node is in the set of nodes that results from that reference to the <code>
   * key</code> function. This is used in the implementation of key patterns.
   *
   * <p>This particular {@link KeyIndex} object is the result evaluating the first argument to the
   * <code>key</code> function, so it's not taken into any further account.
   *
   * @param node The context node
   * @param value The second argument to the <code>key</code> function
   * @return <code>1</code> if and only if the context node is in the set of nodes returned by the
   *     reference to the <code>key</code> function; <code>0</code>, otherwise
   */
  public int containsKey(int node, Object value) {
    int rootHandle = _dom.getAxisIterator(Axis.ROOT).setStartNode(node).next();

    // Get the mapping table for the document containing the context node
    Hashtable index = (Hashtable) _rootToIndexMap.get(new Integer(rootHandle));

    // Check whether the context node is present in the set of nodes
    // returned by the key function
    if (index != null) {
      final IntegerArray nodes = (IntegerArray) index.get(value);
      return (nodes != null && nodes.indexOf(node) >= 0) ? 1 : 0;
    }

    // The particular key name identifies no nodes in this document
    return 0;
  }
コード例 #4
0
ファイル: KeyIndex.java プロジェクト: napile/napile.classpath
    /**
     * Retrieve nodes for a particular key value or a particular id argument value.
     *
     * @param root The root node of the document containing the context node
     * @param keyValue The key value of id string argument value
     * @return an {@link IntegerArray} of the resulting nodes
     */
    protected IntegerArray lookupNodes(int root, String keyValue) {
      IntegerArray result = null;

      // Get mapping from key values/IDs to DTM nodes for this document
      Hashtable index = (Hashtable) _rootToIndexMap.get(new Integer(root));

      if (!_isKeyIterator) {
        // For id function, tokenize argument as whitespace separated
        // list of values and look up nodes identified by each ID.
        final StringTokenizer values = new StringTokenizer(keyValue, " \n\t");

        while (values.hasMoreElements()) {
          final String token = (String) values.nextElement();
          IntegerArray nodes = null;

          // Does the ID map to any node in the document?
          if (index != null) {
            nodes = (IntegerArray) index.get(token);
          }

          // If input was from W3C DOM, use DOM's getElementById to do
          // the look-up.
          if (nodes == null && _enhancedDOM != null && _enhancedDOM.hasDOMSource()) {
            nodes = getDOMNodeById(token);
          }

          // If we found any nodes, merge them into the cumulative
          // result
          if (nodes != null) {
            if (result == null) {
              result = (IntegerArray) nodes.clone();
            } else {
              result.merge(nodes);
            }
          }
        }
      } else if (index != null) {
        // For key function, map key value to nodes
        result = (IntegerArray) index.get(keyValue);
      }

      return result;
    }
コード例 #5
0
ファイル: KeyIndex.java プロジェクト: napile/napile.classpath
  /**
   * Adds a node to the node list for a given value. Nodes will always be added in document order.
   */
  public void add(Object value, int node, int rootNode) {
    if (_currentDocumentNode != rootNode) {
      _currentDocumentNode = rootNode;
      _index = new Hashtable();
      _rootToIndexMap.put(new Integer(rootNode), _index);
    }

    IntegerArray nodes = (IntegerArray) _index.get(value);

    if (nodes == null) {
      nodes = new IntegerArray();
      _index.put(value, nodes);
      nodes.add(node);

      // Because nodes are added in document order,
      // duplicates can be eliminated easily at this stage.
    } else if (node != nodes.at(nodes.cardinality() - 1)) {
      nodes.add(node);
    }
  }
コード例 #6
0
ファイル: KeyIndex.java プロジェクト: napile/napile.classpath
  /**
   * This method must be called by the code generated by the id() function prior to returning the
   * node iterator. The lookup code for key() and id() differ in the way the lookup value can be
   * whitespace separated list of tokens for the id() function, but a single string for the key()
   * function.
   *
   * @deprecated
   */
  public void lookupId(Object value) {
    // Clear _nodes array
    _nodes = null;

    final StringTokenizer values = new StringTokenizer((String) value, " \n\t");
    while (values.hasMoreElements()) {
      final String token = (String) values.nextElement();
      IntegerArray nodes = (IntegerArray) _index.get(token);

      if (nodes == null && _enhancedDOM != null && _enhancedDOM.hasDOMSource()) {
        nodes = getDOMNodeById(token);
      }

      if (nodes == null) continue;

      if (_nodes == null) {
        nodes = (IntegerArray) nodes.clone();
        _nodes = nodes;
      } else {
        _nodes.merge(nodes);
      }
    }
  }
コード例 #7
0
ファイル: KeyIndex.java プロジェクト: napile/napile.classpath
 /**
  * This method must be called by the code generated by the key() function prior to returning the
  * node iterator.
  *
  * <p><em>Use of an instance of this class as a {@link DTMAxisIterator} is <b>deprecated.</b></em>
  *
  * @deprecated
  */
 public void lookupKey(Object value) {
   IntegerArray nodes = (IntegerArray) _index.get(value);
   _nodes = (nodes != null) ? (IntegerArray) nodes.clone() : null;
   _position = 0;
 }