public void init(XMLStructure parent, XMLCryptoContext context)
     throws InvalidAlgorithmParameterException {
   super.init(parent, context);
   try {
     unmarshalParams(DOMUtils.getFirstChildElement(transformElem));
   } catch (MarshalException me) {
     throw new InvalidAlgorithmParameterException(me);
   }
 }
  public void marshalParams(XMLStructure parent, XMLCryptoContext context) throws MarshalException {
    super.marshalParams(parent, context);
    XPathFilter2ParameterSpec xp = (XPathFilter2ParameterSpec) getParameterSpec();
    String prefix = DOMUtils.getNSPrefix(context, Transform.XPATH2);
    String qname = (prefix == null || prefix.length() == 0) ? "xmlns" : "xmlns:" + prefix;
    @SuppressWarnings("unchecked")
    List<XPathType> xpathList = xp.getXPathList();
    for (XPathType xpathType : xpathList) {
      Element elem = DOMUtils.createElement(ownerDoc, "XPath", Transform.XPATH2, prefix);
      elem.appendChild(ownerDoc.createTextNode(xpathType.getExpression()));
      DOMUtils.setAttribute(elem, "Filter", xpathType.getFilter().toString());
      elem.setAttributeNS("http://www.w3.org/2000/xmlns/", qname, Transform.XPATH2);

      // add namespace attributes, if necessary
      @SuppressWarnings("unchecked")
      Set<Map.Entry<String, String>> entries = xpathType.getNamespaceMap().entrySet();
      for (Map.Entry<String, String> entry : entries) {
        elem.setAttributeNS(
            "http://www.w3.org/2000/xmlns/", "xmlns:" + entry.getKey(), entry.getValue());
      }

      transformElem.appendChild(elem);
    }
  }